home *** CD-ROM | disk | FTP | other *** search
Text File | 1985-11-08 | 64.8 KB | 2,917 lines |
- PROGRAM MAIN
- C
- C M68000 CROSS-ASSEMBLER MAIN PROGRAM
- C
- C
- C REVISION:
- C X1.0 (EXPERIMENTAL PRE-RELEASE)
- C
- C AUTHOR:
- C Allen Kossow
- C 2909A N. Fredrick
- C Milwaukee, WI 53211
- C Ph (414) 963-5440
- C
- C SYMBOLS ARE A MAXIMUM OF EIGHT CHRS IN LENGTH
- C THERE CAN BE UP TO 512 SYMBOLS
- C
- C
- C.... LOGICAL UNIT DEFINITION
- C 1 = SOURCE FILE
- C 2 = OBJECT FILE
- C 3 = LIST FILE
- C 5 = KEYBD
- C
- C
- IMPLICIT INTEGER (A-Z)
- BYTE NAME(8),SYMFLG(513)
- C
- COMMON /LST/ LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- C
- COMMON /SYMT/STIND,SYMADR,PC,NOSYM,NEWPC,SYMFLG
- C
- COMMON /PRSE/ OPPTR,MODPTR,OPNPTR,LABEL,CMTPTR
- +,PRFLG,SCANPT,OPCLEN,OPNPT2,IMODE
- C
- COMMON /SRC/ LNELEN,ISERR,NOCARD,SRCLNE
- C
- COMMON /OBJOUT/ OBJBUF,OBJWC,LFLG,RFLG,DBFLG
- C
- COMMON /OPCPTS/ OPTYP,OPSKEL,OPSK2,OPIDX
- C
- COMMON /CNVT / WORD,PL
- C
- COMMON /HEXFLG/ ENDFLG,HEXWC,HEXPC,OLDPC
- C
- DIMENSION OBJBUF(40)
- C
- INTEGER*4 PC,NEWPC,SYMADR(512),HEXPC,OLDPC
- C
- BYTE ERR,SRCLNE(81),LABEL(8),PL(132)
- C
- C.... TELL FORTRAN TO IGNORE INTEGER OVERFLOWS ON MULTIPLY AND DIVIDE.
- C
- ERR=128
- C
- C.... THE FOLLOWING CALL IS NO OP'ED OUT FOR F4P
- C
- C CALL SETERR(1,ERR)
- C
- C.... INITIALIZE VARIABLES
- C
- 5 NOPAGE=0
- RFLG=1
- LFLG=1
- C
- C.... OPEN FILES
- C
- CALL SOURCE(1)
- CALL LIST(1)
- CALL OBJECT(1)
- C
- C.... DO PASS 1
- C
- 1 NOSYM=0
- PASS=1
- CALL I4CLR(PC)
- DO 10 I=1,8
- NAME(I)=32
- 10 CONTINUE
- C
- C.... READ ONE LINE OF SOURCE FILE
- C
- 15 CALL I4CLR(NEWPC)
- CALL SOURCE(2)
- C
- C.... IF EOF DETECTED DO PASS 2
- C
- IF(ISERR.EQ.1) GOTO 20
- C
- C.... RESET MULTIPLE ERROR FLG
- C
- MEFLG = 0
- C
- C.... PARSE SOURCE LINE
- C
- CALL PARSE
- C
- C.... IF NULL LINE GET NEXT LINE
- C
- IF(PRFLG.EQ.0) GOTO 15
- C
- C.... PROCESS SOURCE LINE
- C
- CALL PRCESS
- C
- C.... IF END DETECTED DO PASS 2 ELSE GET NEXT LINE
- C
- IF(ISERR.EQ.1) GOTO 20
- I=JADD(PC,NEWPC,PC)
- GOTO 15
- C
- C.... DO PASS 2
- C
- C
- C.... REW SOURCE SET TO PASS 2 AND RESET PC
- C
- 20 CALL SOURCE(3)
- PASS=2
- IERCNT = 0
- CALL I4CLR(PC)
- CALL I4CLR(HEXPC)
- CALL I4CLR(OLDPC)
- C
- C.... FLUSH PRINT BUFFER IN CASE ANYTHING LEFT
- C.... FROM LAST ASSEMBLY
- C
- DO 25 I=1,132
- 25 PL(I) = "40
- C
- C.... INITIALIZE OBJECT BUFFER
- C
- ENDFLG = 0
- HEXWC = 0
- C
- C.... PRINT FIRST PAGE HEADING
- C
- CALL NEWPAG
- 30 CALL I4CLR(NEWPC)
- OBJWC = 0
- CALL SOURCE(2)
- C
- C.... EOF DETECTED
- C
- IF(ISERR.EQ.1) GOTO 50
- C
- C.... RESET MULTIPLE ERROR FLG
- C
- MEFLG = 0
- C
- C.... PARSE LINE
- C
- CALL PARSE
- C
- C.... PRINT A LINE OF ONLY COMMENTS NORMALLY
- C
- IF(CMTPTR.EQ.1) GOTO 40
- C
- C.... CHECK FOR PARSING ERRORS
- C
- IF(PRFLG.EQ.0) GOTO 30
- C
- C.... PROCESS IT
- C
- 38 CALL PRCESS
- C
- C.... GENERATE LISTING
- C
- 40 CALL LSTLNE
- C
- C.... CHECK IF THERE IS OBJ CODE TO GENERATE
- C
- IF(OBJWC.EQ.0) GOTO 45
- CALL BLDOBJ
- C
- C.... DO NEXT LINE IF NOT END
- C
- 45 IF(ISERR.EQ.1) GOTO 50
- I=JADD(PC,NEWPC,PC)
- GOTO 30
- C
- C.... END OF ASSEMBLY, OUTPUT BALANCE OF OBJ BUFFER
- C
- 50 ENDFLG = 1
- CALL BLDOBJ
- C
- C.... PRINT SYMBOL TABLE
- C
- CALL PST
- C
- C.... CLOSE FILES AND DO IT AGAIN
- C
- CALL SOURCE(4)
- CALL LIST(2)
- CALL OBJECT(2)
- GOTO 5
- END
- SUBROUTINE SOURCE(ICODE)
- C
- C PERFORMS ALL OPERATIONS OF SOURCE INPUT FILE
- C
- C INPUT:
- C ICODE = 1 => OPEN SOURCE FILE (NAME READ FROM KEYBOARD)
- C 2 => READ ONE LINE FROM SOURCE FILE INTO
- C 'SRCLNE' (80R1 FORMAT). TRAILING BLANKS
- C ARE DELETED. ZERO CHAR IS INSERTED AT
- C THE END OF THE LINE.
- C 3 => REWIND SOURCE FILE.
- C 4 => CLOSE SOURCE FILE.
- C
- C OUTPUT:
- C SRCLNE = SOURCE LINE FOR CODE 2
- C LNELEN = LENGTH OF LINE FOR CODE 2
- C ISERR = 1 IF END OF FILE ON READ (ZERO OTHERWISE)
- C NOCARD = CARD NUMBER READ FROM SOURCE (1-?)
- C
- BYTE FILNAM(12)
- BYTE SRCLNE(81)
- COMMON/SRC/LNELEN,ISERR,NOCARD,SRCLNE
- COMMON /FNAM/ FILNAM,OBJFLG
- C
- C SELECT FUNCTION
- C
- GO TO (100,200,300,400),ICODE
- C
- C OPEN SOURCE FILE
- C
- 100 TYPE 110
- 110 FORMAT('$Src file name: ')
- READ (5,120) ICNT,FILNAM
- 120 FORMAT(Q,12A1)
- IF(ICNT.EQ.0) STOP
- CALL ASSIGN(1,FILNAM,ICNT)
- NOCARD=0
- GOTO 500
- C
- C READ SOURCE LINE
- C
- 200 ISERR=0
- READ(1,210,END=250) (SRCLNE(I),I=1,80)
- 210 FORMAT(80A1)
- NOCARD=NOCARD+1
- C
- C CONVERT ALL CHARACTERS
- C
- DO 225 I=1,80
- IF(SRCLNE(I).GE.32) GO TO 220
- 215 SRCLNE(I)=32
- GO TO 225
- 220 IF(SRCLNE(I).LT.96) GO TO 225
- SRCLNE(I)=SRCLNE(I)-32
- IF(SRCLNE(I).GE.96) GO TO 215
- 225 CONTINUE
- C
- C REMOVE TRAILING BLANKS
- C
- LNELEN=80
- 230 IF(SRCLNE(LNELEN).NE.32) GO TO 240
- LNELEN=LNELEN-1
- IF(LNELEN.GT.0) GO TO 230
- 240 LNELEN=LNELEN+1
- SRCLNE(LNELEN)=0
- GO TO 500
- C
- C END OF FILE
- C
- 250 ISERR=1
- GO TO 500
- C
- C REWIND SOURCE FILE
- C
- 300 REWIND 1
- NOCARD=0
- GO TO 500
- C
- C CLOSE SOURCE FILE
- C
- 400 CLOSE(UNIT=1)
- 500 RETURN
- END
- SUBROUTINE LIST(LCODE)
- C
- C PERFORMS OPEN AND CLOSE ON LIST FILE
- C
- C INPUT:LCODE = 1 => OPEN FILE (NAME READ FROM KEYBOARD)
- C 2 => CLOSE FILE
- C
- BYTE FILNAM(12)
- INTEGER PASS
- BYTE NAME(8)
- C
- COMMON /LST/ LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- C
- COMMON /FNAM/ FILNAM,OBJFLG
- C
- C SELECT FUNCTION
- C
- GO TO (100,200),LCODE
- C
- C.... ASSIGN DEFAULT LISTING TO CONSOLE
- C
- 100 LUNIT=5
- TYPE 110
- 110 FORMAT('$Lst file name: ')
- READ (5,115) ICNT,FILNAM
- 115 FORMAT(Q,12A1)
- IF(ICNT.EQ.0) GOTO 116
- C
- C.... IF THERE IS A FILENAME ASSIGN LISTING TO LUN 3
- C
- LUNIT = 3
- CALL ASSIGN(LUNIT,FILNAM,ICNT)
- 116 NOPAGE=0
- GO TO 300
- C
- C CLOSE FILE
- C
- 200 IF(LUNIT.EQ.5) RETURN
- CALL CLOSE(LUNIT)
- 300 RETURN
- END
- SUBROUTINE OBJECT(ICODE)
- C
- C PERFORMS OPEN AND CLOSE ON OBJECT FILE
- C
- BYTE FILNAM(12)
- INTEGER PASS
- BYTE NAME(8)
- COMMON /LST/ LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- COMMON /FNAM/ FILNAM,OBJFLG
- GOTO (100,200),ICODE
- 100 TYPE 110
- 110 FORMAT ('$Obj file name: ')
- READ (5,115) ICNT,FILNAM
- 115 FORMAT(Q,12A1)
- IF(ICNT .EQ.0) GOTO 116
- CALL ASSIGN(2,FILNAM,ICNT)
- OBJFLG = 1
- RETURN
- 116 OBJFLG = 0
- RETURN
- 200 IF(OBJFLG.EQ.0) RETURN
- CALL CLOSE(2)
- RETURN
- END
- SUBROUTINE SYMTBL(ICODE,IADDR,SYMSTR)
- C
- C SYMBOL TABLE PROCESSOR
- C
- C INPUT:
- C ICODE = 1 => FIND OPERAND IN SYMBOL TABLE. IF NOT FOUND,
- C IT IS ENTERED INTO THE TABLE AS REFERENCED
- C BUT NOT DEFINED. THE INDEX OF THE SYMBOL
- C IN THE SYMBOL IS RETURNED IN 'STIND'.
- C
- C 2 => FIND LABEL IN SYMBOL TABLE. IF FOUND AND ALREADY
- C DEFINED AND THIS IS THE FIRST PASS OF THE
- C ASSEMBLER, THE MULTIPLE DEFINED BIT IS SET IN
- C SYMFLG. IF FOUND BUT ONLY PREVIOUSLY REFERENCED,
- C THE DEFINED BUT PREVIOUSLY REFERENCED BIT IS SET
- C AND THE REFERENCED BIT IS CLEARED. IF NOT FOUND,
- C IT IS ENTERED AND THE DEFINED BIT IS SET.
- C
- C IADDR = ADDRESS OF SYMBOL FOR ENTERING INTO SYMBOL TABLE.
- C SYMBOL= SYMBOL TO LOOK UP OR ENTER IN SYMBOL TABLE.
- C
- C OUTPUT:
- C STIND = INDEX INTO SYMBOL TABLE FOR SYMBOL.
- C
- C FORMAT OF 'SYMFLG':
- C
- C BIT MEANING IF SET
- C 0 SYMBOL HAS BEEN REFERENCED BUT NOT DEFINED.
- C 1 SYMBOL HAS BEEN DEFINED AND WAS REFERENCED BEFORE DEFINITION.
- C 2 SYMBOL HAS BEEN DEFINED AND THERE WERE NO REFERENCES BEFORE.
- C 3 SYMBOL HAS BEEN MULTIPLE DEFINED.
- C 4 SYMBOL IS AN EQUATED VALUE
- C
- IMPLICIT INTEGER (A-Z)
- BYTE SYMFLG(513),SYMSTR(8),SRCLNE(81)
- DIMENSION SYMSYM(4,512),SYMBOL(4),SYMLIN(512)
- INTEGER*4 SYMADR(512),IADDR
- INTEGER*4 PC,NEWPC
- COMMON/SYMT/STIND,SYMADR,PC,NOSYM,NEWPC,SYMFLG
- BYTE NAME(8)
- COMMON /LST/ LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- COMMON /SRC/ LNELEN,ISERR,NOCARD,SRCLNE
- COMMON/SYMN/SYMSYM,SYMLIN
- C
- C PACK SYMBOL TWO BYTES TO A WORD
- C
- DO 100 J=1,4
- I = J*2
- 100 SYMBOL(J) = ((SYMSTR(I-1)*256).OR.SYMSTR(I))
- C
- C SEARCH FOR SYMBOL IN SYMBOL TABLE
- C
- STIND = 1
- MOVFLG = 0
- IF(NOSYM.EQ.0) GO TO 200
- DO 120 STIND=1,NOSYM
- DO 110 J=1,4
- IF(SYMSYM(J,STIND).NE.SYMBOL(J)) GO TO 115
- 110 CONTINUE
- GO TO 300
- 115 DO 118 J=1,4
- IF (SYMSYM(J,STIND).LT.SYMBOL(J)) GOTO 120
- IF (SYMSYM(J,STIND).EQ.SYMBOL(J)) GOTO 118
- MOVFLG = 1
- GOTO 200
- 118 CONTINUE
- 120 CONTINUE
- C
- C SYMBOL WAS NOT FOUND
- C
- 200 IF(NOSYM.LT.513) GO TO 210
- CALL ERROR(221)
- STIND=513
- GOTO 400
- 210 IF (MOVFLG.EQ.0) GOTO 218
- ITEMP = NOSYM
- 211 DO 212 J=1,4
- 212 SYMSYM(J,ITEMP+1) = SYMSYM(J,ITEMP)
- CALL JMOV (SYMADR(ITEMP),SYMADR(ITEMP+1))
- SYMFLG(ITEMP+1) = SYMFLG(ITEMP)
- SYMLIN(ITEMP+1) = SYMLIN(ITEMP)
- ITEMP = ITEMP - 1
- IF (ITEMP.GE.STIND) GOTO 211
- 218 NOSYM = NOSYM + 1
- DO 220 J = 1,4
- 220 SYMSYM (J,STIND) = SYMBOL(J)
- IF(ICODE.EQ.1) GO TO 250
- SYMFLG(STIND)=4
- CALL I4CLR(SYMADR(STIND))
- I=JADD(SYMADR(STIND),IADDR,SYMADR(STIND))
- SYMLIN(STIND) = NOCARD
- GOTO 400
- 250 CALL I4CLR(SYMADR(STIND))
- SYMFLG(STIND)=1
- SYMLIN(STIND) = 0
- GOTO 400
- C
- C SYMBOL FOUND
- C
- 300 IF(PASS.EQ.2.OR.ICODE.EQ.1) GOTO 400
- IF(SYMFLG(STIND).NE.1) GO TO 310
- SYMFLG(STIND)=2
- CALL I4CLR(SYMADR(STIND))
- I=JADD(SYMADR(STIND),IADDR,SYMADR(STIND))
- SYMLIN(STIND) = NOCARD
- GOTO 400
- 310 SYMFLG(STIND)=SYMFLG(STIND).OR.8
- 400 RETURN
- END
- SUBROUTINE CNVHEX(INDEX)
- C
- C CONVERTS 4 BITS TO HEX ASCII AND INSERTS INTO 'PL' AT 'INDEX'
- C
- C INPUT: WORD = VALUE
- C INDEX= WHERE TO INSERT IN PL
- C
- C OUTPUT:
- C WORD = WORD/16
- C
- BYTE PL(132),DIG
- INTEGER WORD
- COMMON /CNVT/ WORD,PL
- CALL GETBIT(WORD,DIG)
- PL(INDEX)=DIG
- RETURN
- END
- SUBROUTINE INSDAT(IPL,IDIG)
- C
- C CONVERTS BINARY DATA TO HEX ASCII AND INSERTS INTO 'PL'
- C
- C INPUT:IPL = INDEX TO INSERT INTO PL
- C IDIG= NUMBER OF DIGITS TO CONVERT AND INSERT
- C WORD= VALUE TO CONVERT (IN COMMON - NOT REFERENCED HERE)
- C
- I=IDIG
- 5 J=IPL+I-1
- CALL CNVHEX(J)
- I=I-1
- IF(I.LE.0) RETURN
- GO TO 5
- END
-
- SUBROUTINE IHX(ISZ,IDTA,IPPOS)
- C
- C PRINT A 4 OR 8 DIGIT HEX VALUE
- C NUMBER OBTAINED STARTING AT 'WORD'
- C AND PUT INTO PRINT BUFFER 'PL' STARTING IN COL 1
- C
- IMPLICIT INTEGER (A-Z)
- COMMON /CNVT/ WORD,PL
- COMMON /LST/LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- BYTE PL(132),NAME(8)
- DIMENSION IDTA(3)
- PL(1)=32
- IF(ISZ.EQ.2) GOTO 15
- WORD=IDTA(1)
- CALL INSDAT(IPPOS,4)
- RETURN
- 15 WORD=IDTA(2)
- CALL INSDAT(IPPOS,4)
- WORD=IDTA(1)
- CALL INSDAT(IPPOS+4,4)
- RETURN
- END
-
- SUBROUTINE PST
- C
- C SORT AND PRINT SYMBOL TABLE
- C
- INTEGER PASS,STIND,SYMLIN(512)
- INTEGER*4 PC,NEWPC,SYMADR(512)
- BYTE NAME(8),SYMSYM(8,512),SYMFLG(513),PL(132)
- COMMON/LST/LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- COMMON/SYMN/SYMSYM,SYMLIN
- COMMON/SYMT/STIND,SYMADR,PC,NOSYM,NEWPC,SYMFLG
- COMMON /CNVT/ WORD,PL
- IF(NOSYM.EQ.0) RETURN
- C
- C START OUT WITH CLEAN BUFFER
- C
- DO 50 I = 1,132
- 50 PL(I) = "40
- C
- C GOTO TOP OF PAGE
- C
- CALL NEWPAG
- C
- C GENERATE THE SYMBOL LIST A LINE AT A TIME
- C
- DO 300 I = 1,NOSYM,5
- DO 210 IDX=0,4
- IF (I+IDX.GT.NOSYM) GOTO 290
- DO 170 IPT=1,7,2
- PL(IPT+(IDX*24)+1) = SYMSYM(IPT,(I+IDX))
- 170 PL(IPT+(IDX*24)) = SYMSYM(IPT+1,(I+IDX))
- CALL IHX(2,SYMADR(I+IDX),(IDX*24)+12)
- IFTMP = SYMFLG(I+IDX)
- IF ((IFTMP.AND.16).NE.16 ) GOTO 180
- PL((IDX*24)+19) = 'E'
- PL((IDX*24)+20) = 'Q'
- 180 IF ((IFTMP.AND.8).NE.8 ) GOTO 190
- PL((IDX*24)+19) = 'M'
- PL((IDX*24)+20) = 'U'
- 190 IF ((IFTMP.AND.1).NE.1) GOTO 200
- PL((IDX*24)+19) = 'U'
- PL((IDX*24)+20) = 'N'
- 200 IF ((IFTMP.AND."31).NE.0) GOTO 210
- PL((IDX*24)+19) = ' '
- PL((IDX*24)+20) = ' '
- 210 CONTINUE
- 290 WRITE (LUNIT,400) (PL(N),N=1,IDX*24)
- NOLINE = NOLINE -1
- CALL PAGCHK
- 300 CONTINUE
- 400 FORMAT (' ',132A1)
- WRITE (LUNIT,410) NOSYM,IERCNT
- 410 FORMAT (/,' ',I3,' SYMBOLS , ',I3,' ERRORS DETECTED')
- IF (LUNIT.EQ.5) RETURN
- WRITE (5,410) NOSYM,IERCNT
- RETURN
- END
- SUBROUTINE NEWPAG
- IMPLICIT INTEGER (A-Z)
- C
- C PUTS OUT HEADERS AT TOP OF EACH PAGE
- C
- INTEGER PASS
- BYTE NAME(8),FF
- COMMON /LST/ LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- FF="14
- NOPAGE=NOPAGE+1
- NOLINE = 57
- IF(NOPAGE.EQ.1) FF = 0
- WRITE(LUNIT,10)FF,NAME,NOPAGE
- 10 FORMAT(' ',1A1,8A1,T28,'M68000 CROSS-ASSEMBLER X1.0
- +',T83,'PAGE ',I3,/)
- RETURN
- END
- SUBROUTINE PAGCHK
- IMPLICIT INTEGER (A-Z)
- C
- C CHECKS TO SEE IF A PAGE HAS BEEN FILLED
- C
- BYTE NAME(8)
- COMMON /LST/ LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- IF(NOLINE.EQ.0) CALL NEWPAG
- RETURN
- END
- SUBROUTINE ERROR(IERR)
- IMPLICIT INTEGER(A-Z)
- C
- C AND PRINTS ERROR MESSAGE DURING PASS 2
- C
- COMMON /LST/ LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- COMMON /SRC/ LNELEN,ISERR,NOCARD,SRCLNE
- COMMON /PRSE/ OPPTR,MODPTR,OPNPTR,LABEL,CMTPTR
- +,PRFLG,SCANPT,OPCLEN,OPNPT2,IMODE
- COMMON /OBJOUT/ OBJBUF,OBJWC,LFLG,RFLG,DBFLG
- DIMENSION OBJBUF(40)
- COMMON /SYMT/STIND,SYMADR,PC,NOSYM,NEWPC,SYMFLG
- INTEGER*4 PC,NEWPC,SYMADR(512)
- LOGICAL*1 SYMFLG(513),ERRPTR(80),NAME(8),SRCLNE(81)
- LOGICAL*1 LABEL(8)
- C
- C.... ERRORS ARE IGNORED DURING THE FIRST PASS
- C
- IF(PASS.EQ.1) RETURN
- C
- PRFLG = 3
- C
- C.... WE NEED AT LEAST THREE LINES TO PRINT AN BAD LINE
- C
- IF(NOLINE.LE.2) NOLINE = 0
- CALL PAGCHK
- C
- C.... IF THIS IS NOT THE FIRST ERROR THEN DON'T PRINT THE LINE
- C
- IF (MEFLG.EQ.1) GOTO 15
- WRITE(LUNIT,10) NOCARD,(SRCLNE(I),I=1,LNELEN-1)
- 10 FORMAT(' ',/,' ',I4,35X,80A1:)
- NOLINE = NOLINE - 2
- 15 DO 20,I=1,SCANPT
- 20 ERRPTR(I)="40
- ERRPTR(I)="136
- WRITE(LUNIT,30) IERR,(ERRPTR(I),I=1,SCANPT+1)
- 30 FORMAT(' ++++ ERROR ',I3,20X,80A1:)
- NOLINE = NOLINE - 1
- IERCNT = IERCNT + 1
- MEFLG = 1
- RETURN
- END
- SUBROUTINE LSTLNE
- IMPLICIT INTEGER (A-Z)
- C
- C BUILD LINE (OR LINES IF DC.B DC.W DC.L)
- C FOR DISPLAY
- C
- COMMON /SRC/ LNELEN,ISERR,NOCARD,SRCLNE
- C
- COMMON /CNVT/ WORD,PL
- C
- COMMON /LST/ LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- C
- COMMON /OBJOUT/ OBJBUF,OBJWC,LFLG,RFLG,DBFLG
- C
- COMMON /SYMT/ STIND,SYMADR,PC,NOSYM,NEWPC,SYMFLG
- C
- COMMON /PRSE/ OPPTR,MODPTR,OPNPTR,LABEL,CMTPTR
- +,PRFLG,SCANPT,OPCLEN,OPNPT2,IMODE
- C
- INTEGER*4 PC,NEWPC,SYMADR(512)
- DIMENSION OBJBUF(40)
- BYTE SYMFLG(513),NAME(8),LABEL(8),SRCLNE(81),PL(132)
- DATA PL/132*"40/
- C
- C PRFLG = 0 ERRORS DETECTED (PRINT LINE AS READ)
- C 1 NO ERRORS DETECTED (PRINT NORMALLY)
- C 2 DC.W / DC.L DIRECTIVES
- C 3 SUPRESS PRINTOUT OF LINE
- C 4 DC.B DIRECTIVE
- C 5 NAM / END / MON DIRECTIVES
- C 6 EQU / SET DIRECTIVES
- C 7 ORG / RORG DIRECTIVES
- C 8 DS DIRECTIVE
- C 9 PAGE DIRECTIVE
- C
- C
- C
- C IF THIS IS THE FIRST PASS, THEN DONT PRINT ANYTHING
- C
- IF (PASS.EQ.1) RETURN
- C
- C IF CODE IS LONGER THAN FIVE WORDS THEN
- C ONLY PRINT 5 WORDS OF AN INSTRUCTION
- C
- LSWRDS = OBJWC
- IF(OBJWC.GT.5) LSWRDS=5
- C
- C CHECK IF WE HAVE TO GO TO NEXT PAGE
- C
- CALL PAGCHK
- C
- C
- IF(CMTPTR.NE.1)GOTO 80
- OPPTR=1
- GOTO 220
- 80 GOTO (200,200,200,410,500,600,200,200,200,400),PRFLG+1
- 200 CALL IHX(2,PC,7)
- C
- C
- IF(LSWRDS.EQ.0) GOTO 212
- 205 DO 210,I=1,LSWRDS
- 210 CALL IHX(1,OBJBUF(I),11+(5*I))
- C
- C
- 212 IF(LABEL(1).EQ.0) GOTO 220
- DO 215,I=1,8
- 215 PL(I+40)=LABEL(I)
- 220 J=0
- DO 230 I=OPPTR,LNELEN
- PL(J+50)=SRCLNE(I)
- IF(SRCLNE(I).EQ."40) GOTO 240
- 230 J=J+1
- GOTO 1000
- 240 III=0
- DO 250 II=I+1,LNELEN
- IF (II.EQ.CMTPTR) III = 25
- PL(57+III)=SRCLNE(II)
- III = III + 1
- 250 IF ((III + 57).GT.132) GOTO 255
- GOTO 1000
- 255 PL(132) = 0
- GOTO 1000
- C
- C PRFLG = 3 (NEW PAGE)
- C
- 400 CALL NEWPAG
- 410 RETURN
- C
- C
- 500 GOTO 205
- C
- C
- 600 GOTO 220
- C
- C
- 700 CALL IHX(2,OBJBUF(2),16)
- GOTO 212
- C
- C
- 1000 DO 1001 I=48,132
- 1001 IF(PL(I).EQ.0)GOTO 1002
- 1002 WRITE(LUNIT,1110) NOCARD,(PL(II),II=6,I-1)
- 1110 FORMAT(' ',I4,132A1)
- DO 1120 II = 1,I
- 1120 PL(II) = "40
- NOLINE = NOLINE - 1
- RETURN
- END
-
- SUBROUTINE BLDOBJ
- IMPLICIT INTEGER (A-Z)
- C
- C BUILD OBJ FILE
- C
- COMMON /FNAM / FILNAM,OBJFLG
- C
- COMMON /OBJOUT/ OBJBUF,OBJWC,LFLG,RFLG,DBFLG
- C
- COMMON /CNVT / WORD,PL
- C
- COMMON /SYMT / STIND,SYMADR,PC,NOSYM,NEWPC,SYMFLG
- C
- COMMON /HEXFLG/ ENDFLG,HEXWC,HEXPC,OLDPC
- C
- DIMENSION OBJBUF(40),HEXBUF(8)
- INTEGER*4 PC,NEWPC,SYMADR(512),OLDPC,NEWVAL,HEXPC
- LOGICAL*1 SYMFLG(513),PL(132),FILNAM(12)
- C
- C CHECK IF OBJ FILE IS TO BE GENERATED
- C
- IF (OBJFLG.EQ.0) RETURN
- C
- C CHECK FOR THE END OF ASSEMBLY FLAG
- C IF IT IS SET, WRITE OUT THE BALANCE OF THE OBJ BUFFER
- C
- IF (ENDFLG.EQ.0) GOTO 10
- IF (HEXWC.NE.0) CALL WRTOBJ(HEXPC,HEXWC,HEXBUF)
- RETURN
- C
- C CHECK THE CURRENT VALUE OF THE PC WITH THAT OF THE ONE SAVED
- C IF THE TWO ARE NOT EQUAL, THEN WRITE OUT THE BALANCE OF THE
- C OBJ BUFFER AND START AT THE NEW PC VAL
- C
- 10 CALL DBLSGL(PC,PC1,PC2)
- CALL DBLSGL(OLDPC,OLDPC1,OLDPC2)
- IF (PC1.NE.OLDPC1) GOTO 50
- IF (PC2.EQ.OLDPC2) GOTO 75
- 50 IF (HEXWC.NE.0) CALL WRTOBJ(HEXPC,HEXWC,HEXBUF)
- CALL JMOV(PC,HEXPC)
- CALL JMOV(PC,OLDPC)
- C
- C EXTRACT OBJECT WORDS FROM OBJECT BUFFER AND
- C PUT THEM INTO AN INTERNAL BUFFER. IF THE
- C INTERNAL BUFFER IS FULL, THEN OUTPUT THE BUFFER.
- C
- 75 I = 1
- 76 HEXWC = HEXWC + 1
- HEXBUF(HEXWC) = OBJBUF(I)
- IF (HEXWC.NE.8) GOTO 99
- C
- C.... OBJECT BUFFER IS FULL, OUTPUT IT TO OBJ FILE
- C
- CALL WRTOBJ(HEXPC,HEXWC,HEXBUF)
- C
- C CALCULATE NEW STARTING PC FOR HEX BUFFER
- C
- N = JICVT(I*2,NEWVAL)
- N = JADD(PC,NEWVAL,HEXPC)
- 99 I = I + 1
- IF (I.LE.OBJWC) GOTO 76
- C
- C CALCULATE WHAT THE NEW PC SHOULD BE BY ADDING
- C THE OBJECT WORD COUNT TO THE CURRENT PC
- C
- I = JADD(OLDPC,NEWPC,OLDPC)
- RETURN
- END
- SUBROUTINE WRTOBJ(HEXPC,HEXWC,HEXBUF)
- IMPLICIT INTEGER(A-Z)
- C
- C OUTPUT THE CONTENTS OF THE OBJECT BUFFER
- C
- C HEXPC = STARTING PC FOR BUFFER
- C HEXWC = NUMBER OF WORDS USED IN BUFFER
- C HEXBUF= 8 WORD OBJECT BUFFER
- C
- COMMON /CNVT/ WORD,PL
- LOGICAL*1 PL(132)
- INTEGER*4 HEXPC
- DIMENSION HEXBUF(8)
- DO 10, I = 1,80
- 10 PL(I) = "40
- CALL IHX(2,HEXPC,1)
- PLIDX = 10
- DO 20,I=1,HEXWC
- 20 CALL IHX(1,HEXBUF(I),PLIDX+(5*(I-1)))
- WRITE (2,100)(PL(I),I=3,10+(5*HEXWC))
- 100 FORMAT(' ',80A1)
- HEXWC = 0
- DO 900, I = 1,80
- 900 PL(I) = "40
- RETURN
- END
- SUBROUTINE PRCESS
- C
- C PROCESSES SOURCE LINE AFTER IT HAS BEEN PARSED BY PARSE
- C
- C INPUT:PARSE OUTPUTS
- C
- C OUTPUT:
- C
- C OBJWC NUMBER OF WORDS REQUIRED FOR INSTRUCTION
- C
- C OBJBUF TABLE OF WORDS GENERATED
- C
- C PRFLG 0 ERRORS DETECTED (PRINT LINE AS READ
- C 1 NO ERRORS DETECTED (PRINT NORMALLY)
- C 2 DC.W/DC.L DIRECTIVES
- C 3 DONT PRINT LINE
- C 4 DC.B DIRECTIVE
- C 5 NAM/END/MON DIRECTIVES
- C 6 EQU/SET DIRECTIVE
- C 7 ORG/RORG DIRECTIVE
- C 8 DS DIRECTIVE
- C 9 PAGE DIRECTIVE
- C
- C NEWPC NEW VALUE FOR PC
- C
- C
- C OP1EA 0 NOT REG OR IMMEDIATE DATA
- C 1 D REG
- C 2 A REG
- C 3 (AN)
- C 4 (AN)+
- C 5 -(AN)
- C 6 # DATA
- C 7 SR
- C 8 CCR
- C 9 USP
- C 10 ERROR DETECTED
- C
- C IMODE 0 NO SIZE SPECIFIED (DEFAULT IS WORD)
- C 1 .B
- C 2 .W
- C 3 .L
- C 4 .S (SHORT BRANCH)
- C
- C ERRORS DEFINED.....
- C
- C 400 UNDEFINED OPCODE
- C 401 OPERAND MISSING FOR OPCODE
- C 402 NO ORG SPECIFIED FOR ORG INSTRUCTION
- C 403 ERROR IN DC OPN VALUE
- C 406 GENERAL ERROR IN DECODING
- C 407 UNDEFINED SYMBOL
- C 408 ERROR IN SIZE OF Y(Ax,Rx) INDEX
- C 409 MULT DEFN SYMBOL
- C
- IMPLICIT INTEGER (A-Z)
- C
- COMMON /OPWD / OPNFLG,OPNWC,OPNWRD
- C
- COMMON /LST / LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- C
- COMMON /OBJOUT/ OBJBUF,OBJWC,LFLG,RFLG,BRFLG
- C
- COMMON /SRC / LNELEN,ISERR,NOCARD,SRCLNE
- C
- COMMON /SYMT / STIND,SYMADR,PC,NOSYM,NEWPC,SYMFLG
- C
- COMMON /PRSE / OPPTR,MODPTR,OPNPTR,LABEL,CMTPTR
- +,PRFLG,SCANPT,OPCLEN,OPNPT2,IMODE
- C
- COMMON /OPCPTS/ OPTYP,OPSKEL,OPSK2,OPIDX
- C
- INTEGER*4 PC,NEWPC,SYMADR(512),SYMVAL,TMPVAL,J2
- LOGICAL*1 SRCLNE(81),LABEL(8),NAME(8),SYMFLG(513)
- DIMENSION OBJBUF(40),OPNWRD(3)
- C
- C.... SET UP FLAGS THAT CHANGE EACH TIME THRU
- C
- CALL I4CLR(NEWPC)
- J2 = 2
- OP1EA = 0
- OP2EA = 0
- OP1DA = 0
- OP2DA = 0
- OPNWC = 0
- C
- C.... DECODE OPCODE
- C
- CALL DECOPC
- IF(OPTYP.NE.0) GOTO 10
- CALL ERROR(400)
- RETURN
- C
- C.... SKIP IF NO OPERANDS
- C
- 10 IF(OPNPTR.EQ.0)GOTO 20
- C
- C.... DECODE FIRST OPERAND
- C
- OP1EA=OPNPTR
- CALL EATYP(OP1EA,OP1DA)
- IF(OPNPT2.EQ.0)GOTO 20
- C
- C.... DECODE SECOND OPERAND
- C
- OP2EA=OPNPT2
- CALL EATYP(OP2EA,OP2DA)
- C
- C.... CHECK FOR OPERANDS
- C
- 20 IF(OP1EA.EQ.10.OR.OP2EA.EQ.10) GOTO 8500
- IF(OPTYP.EQ.1.OR.OPTYP.EQ.2) GOTO 90
- IF(OPNPTR.NE.0) GOTO 90
- CALL ERROR(401)
- RETURN
- C
- C.... DEFAULT SIZE IS ONE WORD FOR INSTRUCTIONS
- C
- 90 OBJWC=1
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C GOTO OPCODE EVALUATION ROUTINES VIA OPTYPE
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- GOTO(100,200,300,500,400,600,700,800,900,1000
- +,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100),OPTYP
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS PSEUDO OPS
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C.... PSEUDO OPS NORMALLY DON'T GENERATE CODE
- C.... THE EXECEPTION BEING 'DC'
- C
- 100 OBJWC=0
- GOTO(110,120,130,140,150,195,150,160,170,180,190),OPIDX
- C
- C DC
- C
- 110 PRFLG=2
- IFLG = RFLG
- RFLG = 1
- 111 CALL PROCOP(OPNPTR)
- IF(OPNWC.EQ.0) GOTO 115
- IF(IMODE.EQ.3) OBJWC = OBJWC+2
- IF(IMODE.NE.3) OBJWC = OBJWC+1
- IF(IMODE.EQ.3) OBJBUF(OBJWC-1) = OPNWRD(3)
- IF(IMODE.EQ.3) OBJBUF(OBJWC ) = OPNWRD(2)
- IF(IMODE.NE.3) OBJBUF(OBJWC ) = OPNWRD(2)
- IF(SRCLNE(OPNPTR).NE."54) GOTO 119
- OPNPTR = OPNPTR+1
- GOTO 111
- 115 CALL ERROR(403)
- 118 RFLG = IFLG
- GOTO 7000
- 119 IF(IMODE.NE.1.OR.OPNWRD(2).GE.256) GOTO 118
- OBJBUF(OBJWC)=(OBJBUF(OBJWC)*"400)
- GOTO 118
- C
- C DS
- C
- 120 PRFLG=7
- IF(OPNPTR.EQ.0) GOTO 8500
- CALL PROCOP(OPNPTR)
- IF(OPNWC.EQ.7) GOTO 134
- IF(IMODE.EQ.1) GOTO 122
- IF(IMODE.NE.3) GOTO 125
- I=JICVT(4,NEWPC)
- I=JMUL(NEWPC,OPNWRD(2),NEWPC)
- GOTO 128
- 122 I=JMOV(OPNWRD(2),NEWPC)
- GOTO 128
- 125 I=JICVT(2,NEWPC)
- I=JMUL(NEWPC,OPNWRD(2),NEWPC)
- 128 I=JMOV(PC,OBJBUF(2))
- I=JMOV(PC,SYMVAL)
- GOTO 7005
- C
- C ORG
- C
- 130 IF(LABEL(1).EQ.0) GOTO 132
- 131 CALL ERROR(402)
- RETURN
- C
- 132 RFLG=1
- 133 PRFLG=7
- IF(OPNPTR.NE.0) GOTO 134
- CALL I4CLR(NEWPC)
- CALL I4CLR(PC)
- RETURN
- 134 CALL PROCOP(OPNPTR)
- IF(OPNWC.EQ.7) GOTO 135
- CALL I4CLR(PC)
- I=JADD(NEWPC,OPNWRD(2),NEWPC)
- RETURN
- 135 CALL ERROR(403)
- RETURN
- C
- C END <STARTING ADR>
- C
- 140 ISERR=1
- IF(LABEL(1).NE.0) GOTO 131
- PRFLG=5
- RETURN
- C
- C EQU
- C
- 150 IF(LABEL(1).EQ.0) GOTO 131
- PRFLG=6
- IF(OPNPTR.EQ.0) GOTO 8500
- CALL PROCOP(OPNPTR)
- IF(OPNWC.EQ.7) RETURN
- CALL SYMTBL(2,OPNWRD(2),LABEL)
- IF((SYMFLG(STIND).AND."10).EQ."10)CALL ERROR(409)
- I=JMOV(OPNWRD(2),SYMADR(STIND))
- SYMFLG(STIND)=SYMFLG(STIND).OR.16
- I=JMOV(SYMADR(STIND),OBJBUF(2))
- RETURN
- C
- C RORG
- C
- 160 IF(LABEL(1).NE.0) GOTO 131
- RFLG=0
- GOTO 133
- C
- C PAGE
- C
- 170 IF(LABEL(1).NE.0)GOTO 131
- LFLG=0
- PRFLG=9
- RETURN
- C
- C LIST
- C
- 180 IF(LABEL(1).NE.0)GOTO 131
- LFLG=1
- PRFLG=3
- RETURN
- C
- C NLIST
- C
- 190 IF(LABEL(1).NE.0) GOTO 131
- LFLG=0
- PRFLG=3
- RETURN
- C
- C NAM
- C
- 195 IF(LABEL(1).NE.0) GOTO 131
- DO 197 I=1,8
- 197 NAME(I)="40
- N=1
- DO 196 I=OPNPTR,OPNPTR+7
- NAME(N)=SRCLNE(I)
- N=N+1
- 196 IF(I.EQ.LNELEN-1) RETURN
- RETURN
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS INHERENT INSTRUCTIONS..IE NOP
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 200 OBJBUF(1)=OPSKEL
- GOTO 7000
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS MOVE INSTRUCTION
- C <EA>,<EA> SR,<EA> <EA>,CCR <EA>,SR USP,An An,USP
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C.... LOOK FOR OBVIOUS MISTAKES
- C
- 300 IF(OP2EA .EQ.6.OR.OP1EA .EQ.8) GOTO 8500
- IF(OP1EA.EQ.9 .AND.OP2EA.NE.2) GOTO 8500
- IF(OP1EA.NE.2 .AND.OP2EA.EQ.9) GOTO 8500
- IF(OPNPTR.EQ.0.OR.OPNPT2.EQ.0) GOTO 8500
- C
- C.... SR,<EA> - USP,<EA>
- C
- IF(OP1EA.EQ.7.OR. OP1EA.EQ.9) GOTO 350
- C
- C.... OP1EA = 1 THRU 5
- C
- IF((OP1EA.GE.1).AND.(OP1EA.LE.5)) GOTO 305
- C
- C.... PROCESS FIRST OPN HERE IF COMPLEX
- C
- CALL PROCOP(OPNPTR)
- C
- C.... CHECK FOR EA TYPES 7-9
- C
- 303 IF(OP2EA.GT.6) GOTO 340
- C
- C.... CHECK FOR FIRST OPERAND IMMEDIATE MODE ADDRESSING
- C
- IF (OP1EA.NE.6) GOTO 304
- C
- C.... SKIP MOVQ IF FWD REF SYMBOL
- C
- IF(OPNFLG.EQ.1) GOTO 304 ! CANNOT BE FWD REF SYM
- IF(IMODE .NE.3) GOTO 304 ! MUST BE .L MODE
- IF(OPNWRD(3).EQ. 0) GOTO 301 ! HI WORD MUST BE ZERO
- IF(OPNWRD(3).EQ.-1) GOTO 301 ! OR MINUS ONE
- GOTO 304
- C
- C.... CHECK IF VAL WITHIN RANGE FOR MOVEQ (+/- 128)
- C.... ALSO CHECK IF DESTINATION IS A DATA REGISTER
- C
- 301 I=ICKVAL(OPNWRD(2))
- IF ((I.EQ.0).AND.(OP2EA.EQ.1)) GOTO 330
- C
- C.... ADD IN OPCODE SIZE BITS
- C
- 304 OBJBUF(1)=OBJBUF(1).OR."30000
- IF(IMODE.EQ.1) OBJBUF(1)=(OBJBUF(1)).AND."17777
- IF(IMODE.EQ.3) OBJBUF(1)=(OBJBUF(1)).AND."27777
- C
- C.... MOVE IN NUMBERS FOR 1ST AND 2ND EXT WORDS
- C
- OBJWC = OBJWC+OPNWC
- OBJBUF(2) = OPNWRD(2)
- OBJBUF(1) = OPNWRD(1)
- IF(OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- GOTO 310
- C
- C.... PROCESS EA TYPES 0-5 FOR FIRST OPN
- C
- 305 OBJBUF(1)=(((OP1EA-1)*"10).OR.OP1DA)
- C
- C.... CHK FOR SIMPLE SECOND OPERANDS
- C
- 310 IF(OP2EA.EQ.0) GOTO 315
- C
- C.... CHK FOR SR,CCR,USP
- C
- IF(OP2EA.GT.6) GOTO 340
- GOTO 320
- C
- C.... CALCULATE COMPLEX SECOND OPN
- C
- 315 CALL PROCOP(OPNPT2)
- OBJBUF(OBJWC+1)=OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(OBJWC+2)=OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(OBJWC+1)=OPNWRD(3)
- OBJWC=OBJWC+OPNWC
- I=(OPNWRD(1).AND.7)*"10
- J=(OPNWRD(1).AND."70)/8
- OBJBUF(1)=OBJBUF(1).OR.((I+J)*"100).OR."30000
- GOTO 325
- C
- C.... PROCESS EA TYPES 0-5 FOR SECOND OPN
- C
- 320 OBJBUF(1)=OBJBUF(1)+(((OP2EA-1).OR.(OP2DA*"10))*"100).OR."30000
- C
- C.... ADD IN SIZE BITS
- C
- 325 IF(IMODE.EQ.1)OBJBUF(1)=OBJBUF(1).AND."17777
- IF(IMODE.EQ.3)OBJBUF(1)=OBJBUF(1).AND."27777
- GOTO 7000
- C
- C.... GEN MOVEQ ALSO CLR SIZE BITS IF SET
- C
- 330 OBJBUF(1) = 0
- OBJBUF(1) = (OPNWRD(2).AND."377).OR."70000.OR.(OP2DA*"1000)
- GOTO 7000
- C
- C.... GENERATE MOVE <EA>,SR - <EA>,CCR - AN,USP
- C
- 340 IF(OP2EA.EQ.7) OBJBUF(1)="43300
- IF(OP2EA.EQ.8) OBJBUF(1)="42300
- IF(OP2EA.NE.9) GOTO 342
- OBJBUF(1) = "47140.OR.OP1DA
- GOTO 7000
- C
- C.... GET NON-REG EA'S IF 0 OR 6
- C
- 342 IF(OP1EA.EQ.0.OR.OP1EA.EQ.6) GOTO 349
- C
- C.... ELSE JUST ADD OR IN THE EA AND REG
- C
- OBJBUF(1)=OBJBUF(1).OR.OP1DA.OR.((OP1EA-1)*"10)
- GOTO 7000
-
- C
- C.... HANDLE STUFF FOR EA'S 0 AND 6
- C
- 349 OBJBUF(1)=OBJBUF(1).OR.OPNWRD(1)
- OBJBUF(2)=OPNWRD(2)
- IF(OPNWC.EQ.2)OBJBUF(2)=OPNWRD(3)
- IF(OPNWC.EQ.2)OBJBUF(3)=OPNWRD(2)
- OBJWC=OBJWC+OPNWC
- GOTO 7000
- C
- C.... GENERATE MOVE SR,<EA> - USP,AN
- C
- 350 IF (OP1EA.EQ.9) GOTO 355 ! SR,<EA>
- IF (OP2EA.EQ.2) GOTO 8500 ! USP,AN
- IF (OP2EA.EQ.0) GOTO 353
- OBJBUF(1) = "40300.OR.OP2DA.OR.((OP2EA-1)*"10)
- GOTO 7000
- C
- 353 CALL PROCOP(OPNPT2)
- OBJBUF(2)=OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- OBJWC = OBJWC + OPNWC
- OBJBUF(1) = "43000.OR.OPNWRD(1)
- GOTO 7000
- C
- 355 OBJBUF(1) = "47150.OR.OP2DA
- GOTO 7000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS CMP INSTRUCTION
- C <EA>,DN <EA>,AN #DATA,<EA> (AY)+,(AX)+
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- 400 IF((OP1EA.EQ.6).AND.(OP2EA.NE.2)) GOTO 460 ! CMPI INSTR
- IF((OP1EA.EQ.5).AND.(OP2EA.EQ.5)) GOTO 480 ! CMPM INSTR
- IF((OP2EA.EQ.1).OR. (OP2EA.EQ.2)) GOTO 410 ! CMP <EA>,DN OR AN
- GOTO 8500 ! ALL ELSE ILLEGAL
- C
- C.... PROCESS <EA>,DN <EA>,AN
- C
- 410 IF(OP2EA.EQ.2.AND.IMODE.EQ.1) GOTO 8500 ! CMPA CANT HAVE .B
- IF(OP2EA.NE.2) GOTO 411
- IF(IMODE.EQ.3) OPSKEL = OPSKEL.OR."500 ! CMPA.L
- IF(IMODE.NE.3) OPSKEL = OPSKEL.OR."200 ! CMPA.W
- 411 IF((OP1EA.EQ.0).OR.(OP1EA.EQ.6)) GOTO 415 ! COMPLEX OPN
- C
- C.... PROCESS FOR REG OPNS
- C
- 412 OBJBUF(1)=OPSKEL.OR.(OP2DA*"1000).OR.((OP1EA-1)*"10).OR.OP1DA
- GOTO 6000
- C
- C.... PROCESS FOR COMPLEX 1ST OPNS
- C
- 415 CALL PROCOP(OPNPTR)
- OBJBUF(1) = OPSKEL.OR.(OP2DA*"1000).OR.(OPNWRD(1).AND."77)
- OBJBUF(2)=OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(2)=OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(3)=OPNWRD(2)
- OBJWC=OBJWC+OPNWC
- GOTO 6000
- C
- C.... CMPI INSTRUCTION
- C.... EVALUATE THE IMMEDIATE PART
- C
- 460 CALL PROCOP(OPNPTR)
- OBJWC = OBJWC + OPNWC
- OBJBUF(2)=OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3) ! PLAY GAMES IF 2 WDS
- IF(OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- C
- C.... CHECK FOR SIMPLE DESTINATION EA
- C
- IF((OP2EA.GT.0).AND.(OP2EA.LT.6)) GOTO 470
- IF(OP2EA.GT.6) GOTO 8500
- CALL PROCOP(OPNPT2)
- OBJBUF(1) = OPSK2.OR.(OPNWRD(1).AND."77)
- OBJBUF(OBJWC+1) = OPNWRD(2)
- IF (OPNWC.EQ.2) OBJBUF(OBJWC+1) = OPNWRD(3)
- IF (OPNWC.EQ.2) OBJBUF(OBJWC+2) = OPNWRD(2)
- OBJWC = OBJWC+OPNWC
- GOTO 6000
- C
- C.... SECOND EA IS NOT COMPLEX
- C
- 470 OBJBUF(1) = OPSK2.OR.OP2DA.OR.((OP2EA-1)*"10)
- GOTO 6000
- C
- C.... CMPM (AY)+,(AX)+
- C
- 480 OBJBUF(1)=OPSKEL+((OP2DA*"1000)+OP1DA)
- GOTO 6000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS ADD,SUB INSTRUCTIONS
- C <EA>,DN <EA>,AN DN,<EA> #DATA,<EA>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- 500 IF(OP2EA.EQ.2) GOTO 525 ! ADDA,SUBA
- IF(OP1EA.EQ.6) GOTO 530 ! ADDI,SUBI
- IF(OP1EA.EQ.1.OR.OP2EA.EQ.1) GOTO 510
- GOTO 8500 ! ALL OTHERS ILLEGAL
- C
- C....
- C
- 510 IF(OP2EA.EQ.1) GOTO 520
- OPSKEL = OPSKEL .OR. "400
- C
- C.... GENERATE DN,<EA>
- C
- OPSKEL = OPSKEL.OR.(OP1DA*"1000)
- IF(OP2EA.EQ.0) GOTO 511
- OBJBUF(1) = OPSKEL.OR.((OP2EA-1)*"10).OR.OP2DA
- GOTO 6000
- C
- 511 CALL PROCOP(OPNPT2)
- 514 OBJBUF(2) = OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- OBJWC = OBJWC+OPNWC
- OBJBUF(1) = OPSKEL.OR.OPNWRD(1)
- GOTO 6000
- C
- C.... GENERATE <EA>,DN
- C
- 520 OPSKEL = OPSKEL.OR.(OP2DA*"1000)
- IF(OP1EA.EQ.0) GOTO 522
- 521 OBJBUF(1) = OPSKEL.OR.((OP1EA-1)*"10).OR.OP1DA
- GOTO 6000
- C
- 522 CALL PROCOP(OPNPTR)
- GOTO 514
- C
- C.... GENERATE <EA>,AN
- C
- 525 IF (IMODE.EQ.1) GOTO 8500
- IF (IMODE.EQ.3) OPSKEL = OPSKEL .OR. "500
- IF ((IMODE.EQ.2).OR.(IMODE.EQ.0)) OPSKEL = OPSKEL.OR."200
- OPSKEL = OPSKEL .OR.(OP2DA*"1000)
- IF((OP1EA.EQ.0).OR.(OP1EA.EQ.6)) GOTO 522
- OBJBUF(1) = OPSKEL.OR.((OP1EA-1)*"10).OR.OP1DA
- GOTO 6000
- C
- C.... GENERATE xxxI
- C
- 530 IF(OP2EA.GT.6) GOTO 8500
- C
- C.... EVALUATE IMMEDIATE EXPRESSION
- C
- CALL PROCOP(OPNPTR)
- C
- C.... TRY GENERATING SHORT FORM OF INSTRUCTION
- C.... AFTER CHECKING TO SEE IF OPERAND WAS FWD REF
- C
- IF(OPNFLG.EQ.1) GOTO 536
- IF(OPNWRD(2).GE.1.AND.OPNWRD(2).LE.8) GOTO 550
- C
- C.... GENERATE EXTENSION WORDS
- C.... LENGTH OF OPERAND DEPENDS ON THE IMODE OF INSTRUCTION
- C
- 536 OBJBUF(2) = OPNWRD(2)
- IF(OPNWC.EQ.2)OBJBUF(2) = OPNWRD(3)
- IF(OPNWC.EQ.2)OBJBUF(3) = OPNWRD(2)
- 537 OBJWC = OBJWC + OPNWC
- C
- C.... IF DEST THRU REG EVAL IT HERE
- C
- 538 IF(OP2EA.EQ.0) GOTO 540
- OBJBUF(1)=OPSK2.OR.((OP2EA-1)*"10).OR.OP2DA
- GOTO 6000
- C
- C.... EVAL NON-REG DEST
- C
- 540 CALL PROCOP(OPNPT2)
- OBJWC = OBJWC + OPNWC
- OBJBUF(1) = OPSK2.OR.OPNWRD(1)
- IF(OPNWC.EQ.1) OBJBUF(OBJWC ) = OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(OBJWC+1) = OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(OBJWC ) = OPNWRD(2)
- GOTO 6000
- C
- C.... GENERATE xxxQ
- C
- 550 IF(OPNWRD(2).EQ.8) OPNWRD(2) = 0
- IF(OPSK2.EQ."2000) OPSK2 = "50400
- IF(OPSK2.EQ."3000) OPSK2 = "50000
- OPSK2 = OPSK2.OR.(OPNWRD(2)*"1000)
- GOTO 538
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS AND,OR INSTRUCTIONS
- C <EA>,DN DN,<EA> #DATA,<EA>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- 600 IF(OP1EA.EQ.6) GOTO 610
- IF(OP2EA.NE.1) GOTO 620
- C
- C.... PROCESS <EA>,DN
- C
- OPSKEL=OPSKEL+(OP2DA*"1000)
- IF(OP1EA.EQ.0) GOTO 605
- OBJBUF(1)=OPSKEL.OR.OP1DA.OR.((OP1EA-1)*"10)
- GOTO 6000
- C
- 605 CALL PROCOP(OPNPTR)
- OBJBUF(1)=OPSKEL.OR.OPNWRD(1)
- OBJBUF(2)=OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(2)=OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(3)=OPNWRD(2)
- OBJWC=OBJWC+OPNWC
- GOTO 6000
- C
- C.... PROCESS #DATA,<EA>
- C
- 610 OPSKEL = OPSK2
- IF(OP2EA.EQ.6) GOTO 8500
- CALL PROCOP(OPNPTR)
- OBJBUF(2)=OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(2)=OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(3)=OPNWRD(2)
- OBJWC=OBJWC+OPNWC
- C
- C.... NOW THAT WE HAVE IMMEDIATE DATA GET ,<EA>
- C
- IF(OP2EA.EQ.0.AND.OP1EA.EQ.1) GOTO 6000
- IF(OP2EA.EQ.0) GOTO 615
- C
- C.... CHECK FOR #DATA,SR OR #DATA,CCR
- C
- IF(OP2EA.LT.7) GOTO 612
- IF(OP2EA.GT.8) GOTO 8500
- IF((IMODE.EQ.1).AND.(OP2EA.EQ.8)) GOTO 611
- IF((IMODE.EQ.1).OR.(IMODE.EQ.3)) GOTO 8500
- 611 OBJBUF(1) = OPSKEL.OR."74
- GOTO 6000
- 612 OBJBUF(1) = OPSKEL.OR.((OP2EA-1)*"10).OR.OP2DA
- GOTO 6000
- C
- C.... EVALUATE ,<EA> FOR COMPLEX ADR
- C
- 615 CALL PROCOP(OPNPT2)
- 630 OBJBUF(OBJWC+1)=OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(OBJWC+1)=OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(OBJWC+2)=OPNWRD(2)
- OBJWC=OBJWC+OPNWC
- OBJBUF(1)=OBJBUF(1).OR.OPSKEL
- GOTO 6000
- C
- C.... EVALUATE DN,<EA>
- C
- 620 OPSKEL=OPSKEL+(OP1DA*"1000).OR."400
- IF(OP2EA.EQ.0) GOTO 615
- OBJBUF(1) = OPSKEL.OR.OP2DA.OR.((OP2EA-1)*"10)
- GOTO 6000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS EOR INSTRUCTION
- C DN,<EA> #DATA,<EA>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 700 IF(OP1EA.EQ.6) GOTO 610
- IF(OP1EA.NE.1) GOTO 8500
- IF(OP2EA.EQ.0) GOTO 620
- OBJBUF(1)=OPSKEL+((OP1EA-1)*"1000)+OP2DA+((OP1EA-1)*"10)
- GOTO 6000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS ROTATES AND SHIFTS
- C DX,DY DATA,DY <EA>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 800 IF(OP1EA.EQ.1.AND.OP2EA.EQ.1) GOTO 810
- IF(OP1EA.EQ.6.AND.OP2EA.EQ.1) GOTO 820
- IF(OP1EA.EQ.0.AND.OP2EA.EQ.1) GOTO 820
- C
- C.... PROCESS <EA>
- C
- IF(OP1EA.EQ.0) GOTO 801
- IF(OP1EA.LT.3.OR.OP1EA.GT.5) GOTO 8500
- OBJBUF(1)=OPSKEL+((OP1EA-1)*"10)+OP1DA
- GOTO 7000
- C
- 801 CALL PROCOP(OPNPTR)
- OBJBUF(1)=OPSKEL+OPNWRD(1)
- OBJBUF(2) = OPNWRD(2)
- IF (OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3)
- IF (OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- OBJWC = OBJWC + OPNWC
- GOTO 7000
- C
- 810 OBJBUF(1) = OPSKEL.OR."40.OR.(OP1DA*"1000).OR.OP2DA
- GOTO 6000
- C
- 820 CALL PROCOP(OPNPTR)
- IF(OPNWRD(2).LT.1.OR.OPNWRD(2).GT.8) GOTO 8500
- IF(OPNWRD(2).EQ.8) OPNWRD(2)=0
- OBJBUF(1)=OPSKEL+(OPNWRD(2)*"1000)+OP2DA
- GOTO 6000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS BRANCH INSTRUCTIONS
- C <LABEL>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 900 IF(OPNPTR.EQ.0) GOTO 8500
- IF(OP1EA .NE.0) GOTO 8500
- BRFLG = 1
- C
- C.... GENERATE BRANCH ADDRESS
- C
- CALL PROCOP(OPNPTR)
- C
- C.... CHK FOR FORCED SHORT ADR MODE
- C
- IF(IMODE.EQ.4) GOTO 910
- C
- C.... CHECK FOR FWD REF SYMBOL OR REF BEFORE DEFINITION
- C
- IF(OPNFLG.EQ.1) GOTO 905
- C
- C.... CHECK FOR SHORT BRANCH
- C
- I = ICKVAL(OPNWRD(2))
- IF((I.EQ.0).AND.(OPNWRD(2).NE."177600)) GOTO 910
- IF(IMODE.EQ.4) CALL ERROR(404)
- C
- C.... ELSE GENERATE TWO WORD BRANCH
- C
- 905 OBJBUF(1) = OPSKEL
- OBJBUF(2) = OPNWRD(2)
- OBJWC = 2
- GOTO 920
- C
- C.... GENERATE SHORT BRANCH
- C
- 910 OBJWC =1
- OPSKEL=OPSKEL+(OPNWRD(2).AND."377)
- OBJBUF(1) = OPSKEL
- 920 BRFLG = 0
- GOTO 7000
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS BIT MODIFICATION INSTRUCTIONS
- C DN,<EA> #DATA,<EA>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1000 IF(OP1EA.EQ.1.OR.OP1EA.EQ.6) GOTO 1010
- GOTO 8500
- 1010 IF(OP1EA.EQ.6) GOTO 1020
- IF(OP2EA.EQ.0) GOTO 1015
- C
- C.... SIMPLE EA'S
- C
- OBJBUF(1) = OPSKEL.OR.(OP1DA*"1000).OR.OP2DA
- OBJBUF(1) = OBJBUF(1) .OR. ((OP2EA-1)*"10)
- GOTO 7000
- C
- 1015 CALL PROCOP(OPNPT2)
- OBJBUF(2) = OPNWRD(2)
- IF (OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3)
- IF (OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- OBJWC = OBJWC + OPNWC
- OBJBUF(1) = OPSKEL.OR.OPNWRD(1).OR.(OP1DA*"1000)
- GOTO 7000
- C
- 1020 CALL PROCOP(OPNPT2)
- IF(OPNWRD(3).NE.0) GOTO 8500
- OBJBUF(2)=OPNWRD(2)
- OBJWC=OBJWC+1
- OBJBUF(1)=OPSK2+(OPNWRD(1).AND."77)
- GOTO 7000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS MULT DIV AND CHK INSTRUCTIONS
- C <EA>,DN
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1100 IF(OP2EA.NE.1) GOTO 8500
- IF(OP1EA.EQ.2) GOTO 8500
- IF(OP1EA.EQ.0.OR.OP1EA.EQ.6) GOTO 1110
- IF(OP1EA.GT.6) GOTO 8500
- OPSKEL=OPSKEL+((OP1EA-1)*"10)+OP1DA
- GOTO 1120
- 1110 CALL PROCOP(OPNPTR)
- OPSKEL=OPSKEL+OPNWRD(1)
- OBJBUF(2)=OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- OBJWC = OBJWC + OPNWC
- 1120 OBJBUF(1)=OPSKEL+(OP2DA*"1000)
- GOTO 7000
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS INSTRUCTIONS OF FORM OPCODE <EA>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C CHK FOR CLR,NEG
- 1200 IF(OPIDX.EQ.18.OR.OPIDX.EQ.25) GOTO 1202
- C CHK FOR NOT,TST
- IF(OPIDX.EQ.27.OR.OPIDX.EQ.48) GOTO 1202
- IF(IMODE.NE.0) GOTO 8500 ! SIZE BITS ILLEGAL
- GOTO 1210
- 1202 IF(IMODE.EQ.1) GOTO 1205
- IF(IMODE.EQ.3) OPSKEL=OPSKEL+"200
- IF(IMODE.EQ.2.OR.IMODE.EQ.0)OPSKEL=OPSKEL+"100
- 1205 IF(OP1EA.EQ.0.OR.OP1EA.GE.6) GOTO 1210
- IF(OP1EA.GT.6) GOTO 8500
- C
- C.... PROCESS REG OPERAND
- C
- OBJBUF(1)=OPSKEL+OP1DA+((OP1EA-1)*"10)
- GOTO 7000
- C
- C.... PROCESS COMPLEX OPERAND
- C
- 1210 IF(OP1EA.NE.0.AND.OP1EA.NE.3) GOTO 8500
- IF(OP1EA.NE.3) GOTO 1215
- OBJBUF(1) = OPSKEL.OR.OP1DA.OR."20
- GOTO 7000
- C
- C.... GENERATE EXTENSION WORDS AS NECESSARY
- C
- 1215 CALL PROCOP(OPNPTR)
- OBJBUF(1) = OPSKEL.OR.OPNWRD(1)
- OBJBUF(2) = OPNWRD(2)
- IF(OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3)
- IF(OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- OBJWC = OBJWC + OPNWC
- GOTO 7000
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS DECR AND BRANCH INSTRUCTIONS
- C DN,<LABEL>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1300 IF(OP1EA.NE.1) GOTO 8500
- OBJBUF(1)=OPSKEL+OP1DA
- I=RFLG
- RFLG=0
- SCANPT = OPNPT2
- CALL PROCOP(OPNPT2)
- OBJBUF(2)=OPNWRD(2)
- IF(I.EQ.1) RFLG=1
- OBJWC=2
- GOTO 7000
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS EXG INSTRUCTION
- C RX,RY
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1400 IF(OP1EA.EQ.0.OR.OP1EA.GT.2) GOTO 8500
- IF(OP2EA.EQ.0.OR.OP2EA.GT.2) GOTO 8500
- OPSKEL=OPSKEL+OP2DA
- OPSKEL=OPSKEL+(OP1DA *"1000)
- IF(OP1EA.EQ.1.AND.OP2EA.EQ.1) OBJBUF(1)=OPSKEL+"500
- IF(OP1EA.EQ.2.AND.OP2EA.EQ.2) OBJBUF(1)=OPSKEL+"510
- IF(OP1EA.EQ.OP2EA) GOTO 7000
- OBJBUF(1)=OPSKEL+"610
- GOTO 7000
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS EXT AND SWAP INSTRUCTIONS
- C DN
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1500 IF(OPIDX.EQ.28) GOTO 1510
- IF(IMODE.EQ.3 ) OPSKEL = OPSKEL.OR."100
- 1510 IF(OP1EA.NE.1) GOTO 8500
- OBJBUF(1)=OPSKEL+OP1DA
- GOTO 7000
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS LEA INSTRUCTION
- C <EA>,AN
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1600 IF(OP1EA.EQ.0) GOTO 1610
- IF(OP1EA.EQ.3) GOTO 1620
- GOTO 8500
- C
- 1610 CALL PROCOP(OPNPTR)
- OBJBUF(1) = OPSKEL.OR.OPNWRD(1).OR.OP2DA
- OBJBUF(2) = OPNWRD(2)
- IF (OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3)
- IF (OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- OBJWC = OBJWC + OPNWC
- GOTO 7000
- C
- 1620 OBJBUF(1) = OPSKEL.OR.OP2DA.OR.OP1DA
- OBJBUF(1) = OBJBUF(1).OR.((OP1EA-1)*"10)
- GOTO 7000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS LINK INSTRUCTION
- C AN,#<DISPLACEMENT>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1700 IF(OP1EA.NE.2.AND.OP2EA.NE.6) GOTO 8500
- CALL PROCOP(OPNPT2)
- IF (OPNWRD(3).EQ.0) GOTO 1710
- IF (OPNWRD(3).EQ.-1)GOTO 1710
- GOTO 8500
- C
- 1710 OBJWC=2
- OBJBUF(1)=OPSKEL+OP1DA
- OBJBUF(2)=OPNWRD(2)
- GOTO 7000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS TRAP INSTRUCTION
- C #<VECTOR>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1800 IF(OP1EA.NE.6) GOTO 8500
- CALL PROCOP(OPNPTR)
- IF(OPNWC.NE.1) GOTO 8500
- IF(OPNWRD(2).GT.16) GOTO 8500
- OBJBUF(1)=OPSKEL+OPNWRD(2)
- GOTO 7000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS ABCD,SBCD,ADDX,SUBX INSTRUCTIONS
- C DY,DX -(AY),-(AX)
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 1900 IF(OP1EA.EQ.1.AND.OP2EA.EQ.1) GOTO 1910
- IF(OP1EA.NE.5.OR.OP2EA.NE.5) GOTO 8500
- 1910 IF(OP1EA.EQ.5) OPSKEL=OPSKEL+8
- OPSKEL=OPSKEL+OP2DA
- OBJBUF(1)=OPSKEL+(OP1DA*"1000)
- GOTO 7000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS UNLK INSTRUCTION
- C AN
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 2000 IF(OP1EA.NE.2) GOTO 8500
- OBJBUF(1)=OPSKEL+OP1DA
- GOTO 7000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS MOVEM,STM,LDM INSTRUCTIONS
- C
- D STM <RLIST>,<ADR> LDM <ADR>,<RLIST>
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- 2100 IF(IMODE.EQ.1) GOTO 8500
- IF(IMODE.EQ.3) OPSKEL = OPSKEL.OR."100
- C
- C.... TRY PICKING UP A REGISTER OPERAND
- C
- OP = OPNPTR
- 2110 CALL RLSTDC(OP,DLIST,ALIST)
- IF ((DLIST.EQ.0).AND.(ALIST.EQ.0)) GOTO 2150
- C
- C.... CHECK IF DESTINATION EA IS LEGAL FOR A STM INSTRUCTION
- C.... -(AN) AND CTL ALTERABLE ADR MODES ARE LEGAL
- C
- IF ((OP2EA.EQ.3).OR.(OP2EA.EQ.5)) GOTO 2112
- IF (OP2EA.EQ.0) GOTO 2112
- GOTO 8500
- C
- C.... REFORMAT DATA AND ADR BITMAPS FOR STM INSTRUCTION
- C
- 2112 IF (OP2EA.NE.5) GOTO 2116
- C
- C.... -(AN) REQUIRES REGISTERS TO BE BACKWARDS IN THE BITMAP
- C
- DLSTI = 0
- ALSTI = 0
- DO 2113,I=0,7
- 2113 IF((DLIST.AND.(2**I)).NE.0) DLSTI = (DLSTI.OR.(2**(7-I)))
- C
- DO 2114,I=0,7
- 2114 IF((ALIST.AND.(2**I)).NE.0) ALSTI = (ALSTI.OR.(2**(7-I)))
- C
- ALIST = DLSTI
- DLIST = ALSTI
- C
- C.... BUILD BITMAP
- C
- 2116 CALL BLDMAP(DLIST,ALIST,OBJBUF(2))
- C
- C.... PROCESS DESTINATION OPERAND
- C
- IF (OP2EA.EQ.0) GOTO 2118
- C
- C.... SIMPLE DESTINATION OPERAND
- C
- OBJWC = 2
- OBJBUF(1) = OPSKEL.OR.OP2DA.OR.((OP2EA-1)*"10)
- GOTO 7000
- C
- C.... PROCESS COMPLEX DESTINATION OPERAND
- C
- 2118 CALL PROCOP(OPNPT2)
- OBJBUF(1) = OPSKEL .OR. OPNWRD(1)
- OBJBUF(3) = OPNWRD(2)
- IF (OPNWC.EQ.2) OBJBUF(3) = OPNWRD(3)
- IF (OPNWC.EQ.2) OBJBUF(4) = OPNWRD(2)
- OBJWC = OBJWC + OPNWC
- GOTO 7000
- C
- C
- C.... PROCESS LDM INSTRUCTION
- C
- C
- 2150 OPSKEL = OPSKEL.OR."2000
- C
- C.... CHECK IF DESTINATION IS LEGAL FOR LDM INSTRUCTION
- C.... (AN)+ AND CTL ADR MODES ARE LEGAL
- C
- IF ((OP2EA.EQ.3).OR.(OP2EA.EQ.4)) GOTO 2152
- IF (OP2EA.EQ.0) GOTO 2152
- GOTO 8500
- C
- C.... PROCESS SOURCE OPERAND
- C
- 2152 IF(OP1EA.EQ.0) GOTO 2155
- OBJBUF(1) = OPSKEL.OR.OP1DA.OR.((OP1EA-1)*"10)
- GOTO 2160
- C
- 2155 CALL PROCOP(OPNPTR)
- OBJBUF(1) = OPSKEL .OR. OPNWRD(1)
- OBJBUF(2) = OPNWRD(2)
- IF (OPNWC.EQ.2) OBJBUF(2) = OPNWRD(3)
- IF (OPNWC.EQ.2) OBJBUF(3) = OPNWRD(2)
- OBJWC = OBJWC + OPNWC
- C
- C.... PROCESS REGISTER LIST
- C
- 2160 OP = OPNPT2
- CALL RLSTDC(OP,DLIST,ALIST)
- IF ((DLIST.EQ.0).AND.(ALIST.EQ.0)) GOTO 8500 ! NO REGISTER LIST!
- C
- C.... REFORMAT DATA AND ADR BITMAPS FOR LDM INSTRUCTION
- C
- CALL BLDMAP(DLIST,ALIST,OBJBUF(OBJWC+1))
- OBJWC = OBJWC + 1
- GOTO 7000
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C HANDLE 'NORMAL' SIZE FIELD SPECIFICATIONS
- C USING INFORMATION FROM VARIABLE 'IMODE'
- C
- C SIZE FIELD NORMALLY IS IN BITS 6 AND 7 OF
- C INSTRUCTION WITH THE FOLLOWING DEFINITION
- C
- C 00 = .B 01 = .W 10 = .L
- C
- C INSTRUCTIONS WITH IMODE = 0 DEFAULT TO
- C A SIZE OF 'WORD'
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- 6000 IF(IMODE.EQ.1) GOTO 7000
- IF(IMODE.EQ.3) OBJBUF(1) = OBJBUF(1).OR."200
- IF((IMODE.EQ.2).OR.(IMODE.EQ.0)) OBJBUF(1)=OBJBUF(1).OR."100
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- C PROCESS LABEL FIELD
- C CURRENT PC VAL IS STORED AS SYMBOL VAL
- C
- C ++++++++++++++++++++++++++++++++++++++++++++++++++
- C
- 7000 CALL I4CLR(SYMVAL)
- I=JADD(SYMVAL,PC,SYMVAL)
- OBJWC=OBJWC*2
- I=JICVT(OBJWC,NEWPC)
- OBJWC=OBJWC/2
- 7005 IF(LABEL(1).EQ.0) RETURN
- CALL SYMTBL(2,SYMVAL,LABEL)
- IF((SYMFLG(STIND).AND."10).EQ."10) CALL ERROR(409)
- RETURN
- C
- C ERROR DETECTED
- C
- 8500 PRFLG = 0
- C
- C IF AN ERROR IS DETECTED, ZERO OBJ BUFFER
- C
- DO 8510 I=1,OBJWC
- 8510 OBJBUF(I) = 0
- IF(PASS.EQ.2) CALL ERROR(406)
- GOTO 7000
- END
- SUBROUTINE RLSTDC(OP,DLIST,ALIST)
- IMPLICIT INTEGER (A-Z)
- C
- C THIS SUBROUTINE WILL ATTEMPT TO PROCESS A REGISTER
- C LIST IN THE SOURCE LINE POINTED TO BY 'OP' INTO
- C A PAIR OF WORDS WHICH CAN BE CONVERTED INTO A REGISTER
- C BITMAP FOR THE 'MOVEM' INSTRUCTION
- C
- COMMON /SRC / LNELEN,ISERR,NOCARD,SRCLNE
- LOGICAL*1 SRCLNE(81)
- C
- C... INITIALIZE DEFAULT OUTPUT VALUES
- C
- DLIST = 0
- ALIST = 0
- C
- C... TRY TO FIND A REGISTER TO DECODE
- C
- 10 CALL RDECOD(OP,REGTYP,REGNUM)
- IF (REGTYP.NE.0) GOTO 20
- IF (GRPFLG.EQ.1) GOTO 999
- C
- C... A REGISTER WASN'T DETECTED, AND NONE
- C... WAS NECESSARY (REG GROUPS), SO JUST RETURN
- C
- RETURN
- C
- C... CHECK FOR '/'
- C
- 20 IF(SRCLNE(OP).NE."57) GOTO 300
- C
- C... '/' DETECTED
- C
- 30 IF(GRPFLG.EQ.0) GOTO 200 ! NOT REGISTER GROUP
- IF(STREG.GE.REGNUM) GOTO 999 ! R7-R0 IS ILLEGAL
- IF(STREGT.NE.REGTYP) GOTO 999 ! A0-D0 IS ILLEGAL
- C
- C... SET BITS IN REGISTER LIST BITMAP
- C
- IF (REGTYP.EQ.2) GOTO 100
- DO 50,I=STREG,REGNUM
- 50 DLIST = (DLIST.OR.(2**I))
- GOTO 150
- 100 DO 120,I=STREG,REGNUM
- 120 ALIST = (ALIST.OR.(2**I))
- 150 STREG = 0
- REGNUM= 0
- GRPFLG= 0
- OP = OP+1
- GOTO 10
- C
- C... ADD AN INDIVIDUAL REGISTER TO LIST
- C
- 200 IF(REGTYP.EQ.1) DLIST = DLIST.OR.(2**REGNUM)
- IF(REGTYP.EQ.2) ALIST = ALIST.OR.(2**REGNUM)
- OP = OP+1
- GOTO 10
- C
- C.... CHECK FOR '-' OR END OF REGISTER LIST
- C
- 300 IF(SRCLNE(OP).NE."55) GOTO 30
- C
- C.... '-' DETECTED, SET UP FOR REG GROUP
- C
- STREG = REGNUM
- STREGT= REGTYP
- GRPFLG= 1
- OP = OP+1
- GOTO 10
- C
- C.... ERROR PROCESSING
- C
- 999 DLIST = 0
- ALIST = 0
- RETURN
- END
-
- SUBROUTINE RDECOD(OP,REGTYP,REGNUM)
- IMPLICIT INTEGER (A-Z)
- C
- C THIS SUBROUTINE RETURNS THE REGISTER TYPE AND NUMBER
- C IF THE NEXT TWO CHARS IN A SOURCE LINE SPECIFY REGISTERS
- C
- C REGTYP = 0 NEXT TWO CHRS DON'T SPECIFY A REGISTER
- C 1 DATA REGISTER
- C 2 ADDRESS REGISTER
- C
- C REGNUM = REGISTER NUMBER (0-7)
- C
- C OP = OP + 2 UNLESS A REGISTER WASN'T FOUND
- C
- C
- COMMON /SRC / LNELEN,ISERR,NOCARD,SRCLNE
- LOGICAL*1 SRCLNE(81)
- C
- REGTYP = 0
- IF (SRCLNE(OP).EQ."101) REGTYP = 2
- IF (SRCLNE(OP).EQ."104) REGTYP = 1
- IF (REGTYP.EQ.0) RETURN
- OP = OP+1
- IF ((SRCLNE(OP).LT."60).OR.(SRCLNE(OP).GT."67)) RETURN
- REGNUM = (SRCLNE(OP).AND."7)
- OP = OP+1
- RETURN
- END
- SUBROUTINE PROCOP(OP)
- C
- C EVALUATE COMPLEX EFFECTIVE ADDRESSES
- C
- C
- C OUTPUT WORDS:
- C
- C OPNFLG 0 IF OPERAND CAN BE USED IN 'QUICK' INSTRUCTIONS
- C 1 IF OPERAND CONTAINED A FWD REF SYMBOL
- C
- C OPNWC NUMBER OF BYTES GENERATED (6 MAX)
- C
- C OPNWRD OPERAND WORDS GENERATED
- C FIRST WORD - ADR TYPE
- C NEXT WORD - OPN DATA <LOW WORD>
- C NEXT WORD - OPN DATA <HIGH WORD>
- C
- IMPLICIT INTEGER (A-Z)
- C
- COMMON /SYMT / STIND,SYMADR,PC,NOSYM,NEWPC,SYMFLG
- C
- COMMON /OPWD / OPNFLG,OPNWC,OPNWRD
- C
- COMMON /OBJOUT/ OBJBUF,OBJWC,LFLG,RFLG,BRFLG
- C
- COMMON /LST / LUNIT,PASS,NAME,NOPAGE,NOLINE,MEFLG,IERCNT
- C
- COMMON /PRSE / OPPTR,MODPTR,OPNPTR,LABEL,CMTPTR
- +,PRFLG,SCANPT,OPCLEN,OPNPT2,IMODE
- C
- COMMON /SRC / LNELEN,ISERR,NOCARD,SRCLNE
- C
- COMMON /SYMN / SYMSYM,SYMLIN
- DIMENSION OBJBUF(40),OPNWRD(3),SYMLIN(512),SYMSYM(4,512)
- LOGICAL*1 TMPSYM(8),SYMFLG(513),NAME(8),SRCLNE(81),LABEL(8)
- INTEGER*4 SYMVAL,TMPVAL,SYMADR(512),J2,J4,J10
- INTEGER*4 PC,NEWPC,J0
- C
- C.... INITIALIZE I*4 CONSTANTS
- C
- J0 = 0
- J2 = 2
- J4 = 4
- J10 = 10
- J256 = 256
- C
- C.... ZERO OPERAND RESULT BUFFER
- C
- DO 10,I=1,3
- 10 OPNWRD(I) = 0
- C
- C.... SET PARSE POINTER TO START OF OPN FOR ERROR PROCESSOR
- C
- SCANPT = OP
- C
- C.... DEFAULT IS NON-IMMEDIATE MODE
- C.... WITH SUB-OPNS ADDED TO ORIG OPN
- C
- IMD = 0
- AMD = 1
- OPNWC = 0
- OPNFLG= 0
- STIND = 0
- OPNFLG = 0
- CALL I4CLR(SYMVAL)
- CALL I4CLR(TMPVAL)
- C
- C.... CHECK FOR '#' <IMMEDIATE MODE>
- C
- 20 IF(SRCLNE(OP).NE."43) GOTO 30
- IMD=1
- 25 OP=OP+1
- CALL I4CLR(TMPVAL)
- C
- C.... CHECK FOR ASCII LITERAL '
- C
- 30 IF (SRCLNE(OP).NE."47) GOTO 35
- IMD = 1
- OP = OP+1
- NOCHRS = 0
- CALL I4CLR(TMPVAL)
- 31 IF (SRCLNE(OP).EQ."47) GOTO 32
- I=JMUL(J256,TMPVAL,TMPVAL)
- NVAL = SRCLNE(OP)
- I=JICVT(NVAL,JADN)
- I=JADD(TMPVAL,JADN,TMPVAL)
- OP = OP+1
- NOCHRS = NOCHRS+1
- IF (NOCHRS.LT.5) GOTO 31
- 32 IF (SRCLNE(OP).EQ."47) OP = OP+1
- C
- C.... CHECK FOR '*' <PC>
- C
- 35 IF(SRCLNE(OP).NE."52) GOTO 60
- IF(AMD.NE.1) GOTO 40
- I=JADD(SYMVAL,PC,SYMVAL)
- GOTO 25
- 40 IF(AMD.NE.2) GOTO 9000
- I=JSUB(SYMVAL,PC,SYMVAL)
- GOTO 25
- C
- C.... CHECK FOR '$' <HEXADECIMAL>
- C
- 60 IF(SRCLNE(OP).NE."44) GOTO 80
- C
- C.... HEXADECIMAL LITERAL
- C
- 65 OP=OP+1
- IF(SRCLNE(OP).GE."60.AND.SRCLNE(OP).LE."71) GOTO 70
- IF(SRCLNE(OP).GE."101.AND.SRCLNE(OP).LE."106) GOTO 75
- GOTO 200
- 70 NVAL=SRCLNE(OP)-"60
- GOTO 78
- 75 NVAL=SRCLNE(OP)-"67
- 78 I=JLSHF(TMPVAL,J4,TMPVAL)
- I=JICVT(NVAL,JADN)
- I=JOR(TMPVAL,JADN,TMPVAL)
- GOTO 65
-
- C
- C.... CHECK FOR 0-9 <DECIMAL>
- C
- 80 IF(SRCLNE(OP).LT."60.OR.SRCLNE(OP).GT."71) GOTO 100
- C
- C.... DECIMAL LITERAL
- C
- 85 NVAL=(SRCLNE(OP)-"60)
- I=JMUL(J10,TMPVAL,TMPVAL)
- I=JICVT(NVAL,JADN)
- I=JADD(TMPVAL,JADN,TMPVAL)
- OP=OP+1
- IF(SRCLNE(OP).GE."60.AND.SRCLNE(OP).LE."71) GOTO 85
- GOTO 200
-
- C
- C.... CHECK FOR A-Z <SYMBOLIC>
- C
- 100 IF(SRCLNE(OP).LT."101.OR.SRCLNE(OP).GT."132) GOTO 200
- N=1
- DO 110 OP=OP,OP+7
- IF(SRCLNE(OP).GE."60.AND.SRCLNE(OP).LE."71) GOTO 105
- IF(SRCLNE(OP).LT."101.OR.SRCLNE(OP).GT."132) GOTO 120
- 105 TMPSYM(N)=SRCLNE(OP)
- 110 N=N+1
- 115 IF(SRCLNE(OP).LT."60) GOTO 120
- IF(SRCLNE(OP).GT."71.AND.SRCLNE(OP).LT."101) GOTO 120
- IF(SRCLNE(OP).GT."132) GOTO 120
- OP=OP+1
- GOTO 115
- C
- C.... FILL EXTRA CHRS WITH SPACES
- C
- 120 IF(N.GT.8) GOTO 125
- TMPSYM(N) = "40
- N=N+1
- GOTO 120
-
- C
- C.... SEARCH SYMBOL TBL
- C
- 125 I=1
- CALL SYMTBL(I,0,TMPSYM)
- C
- C.... IF SYMLIN LESS THAN CURRENT LINE AND NOT 0
- C.... THEN SYMBOL IS DEFINED AND IS NOT A FWD REF
- C
- IF((SYMLIN(STIND).LT.NOCARD).AND.(SYMLIN(STIND).NE.0)) GOTO 130
- C
- C.... CHECK FOR UNDEFINED SYMBOL
- C
- IF(SYMLIN(STIND).EQ.0 ) GOTO 150 ! SYMBOL UNDEFINED
- C
- C.... WE GET TO HERE IF THE SYMBOL IS DEFINED
- C.... BUT WASNT AS OF THIS LINE IN THE ASSEMBLY DURING PASS ONE
- C
- OPNFLG = 1 ! SYMBOL WAS FWD REF
- C
- C.... LABEL HAS BEEN DEFINED
- C.... GET VALUE OF LABEL AND PUT IN TMPVAL
- C
- 130 CALL I4CLR(TMPVAL)
- I=JADD(TMPVAL,SYMADR(STIND),TMPVAL)
- GOTO 200
- C
- C.... GO HERE ON UNDEFINED FIRST AND SECOND PASS SYMBOLS
- C
- 150 IF (PASS.EQ.2) CALL ERROR(407) ! UNDEFINED SYMBOL !!
- C
- C IF THIS IS THE FIRST PASS, THEN THE LENGTH
- C OF ALL OPERANDS OTHER THAN IMMEDIATE BYTE AND WORD
- C ARE FORCED TO TWO WORDS
- C
- OPNFLG = 1
- IF((IMD.EQ.1).AND.(IMODE.NE.3)) GOTO 160
- OPNWC = 2
- RETURN
- 160 OPNWC = 1
- RETURN
- C
- C.... PROCESS +,-,*,/,&,!,<<,>>
- C
- 200 IF(AMD.EQ.1) I=JADD(SYMVAL,TMPVAL,SYMVAL)
- IF(AMD.EQ.2) I=JSUB(SYMVAL,TMPVAL,SYMVAL)
- IF(AMD.EQ.3) I=JMUL(SYMVAL,TMPVAL,SYMVAL)
- IF(AMD.EQ.4) GOTO 205
- IF(AMD.EQ.5) I=JAND(SYMVAL,TMPVAL,SYMVAL)
- IF(AMD.EQ.6) I=JOR (SYMVAL,TMPVAL,SYMVAL)
- IF(AMD.EQ.7) I=JLSHF(SYMVAL,TMPVAL,SYMVAL)
- IF(AMD.EQ.8) I=JRSHF(SYMVAL,TMPVAL,SYMVAL)
- GOTO 210
- C
- C.... DIVIDING BY ZERO IS BAD NEWS
- C
- 205 IF(TMPVAL.EQ.0) GOTO 9000
- I=JDIV(SYMVAL,TMPVAL,SYMVAL)
- 210 AMD=1
- C
- C.... CHECK FOR +,-,*,/
- C
- IF(SRCLNE(OP).NE."53) GOTO 220
- AMD=1
- GOTO 25
- C
- 220 IF(SRCLNE(OP).NE."55) GOTO 230
- AMD=2
- GOTO 25
- C
- 230 IF(SRCLNE(OP).NE."52) GOTO 240
- AMD=3
- GOTO 25
- C
- 240 IF(SRCLNE(OP).NE."57) GOTO 245
- AMD=4
- GOTO 25
- C
- 245 IF(SRCLNE(OP).NE."46) GOTO 246
- AMD = 5
- GOTO 25
- C
- 246 IF(SRCLNE(OP).NE."41) GOTO 247
- AMD = 6
- GOTO 25
- C
- 247 IF(SRCLNE(OP).NE."74) GOTO 248
- IF(SRCLNE(OP+1).NE."74) GOTO 9000
- OP = OP+1
- AMD = 7
- GOTO 25
- C
- 248 IF(SRCLNE(OP).NE."76) GOTO 249
- IF(SRCLNE(OP+1).NE."76) GOTO 9000
- OP = OP+1
- AMD = 8
- GOTO 25
- C
- 249 IF(SRCLNE(OP).NE."50) GOTO 300
- IF(IMD.EQ.1) GOTO 9000
- IF(SRCLNE(OP+3).NE."51) GOTO 250
- C
- C.... A(An)
- C
- IF(SRCLNE(OP+1).NE."101) GOTO 9000
- IF(SRCLNE(OP+2).LT."60.OR.SRCLNE(OP+2).GT."67) GOTO 9000
- OPNWC=1
- OPNWRD(1)=(SRCLNE(OP+2)-"60)+"50
- CALL DBLSGL(SYMVAL,OPNWRD(2),OPNWRD(3))
- RETURN
- C
- C.... A(An,Rn.m)
- C
- 250 CALL DBLSGL(SYMVAL,OPNWRD(2),OPNWRD(3))
- I = ICKVAL(OPNWRD(2))
- IF (I.EQ.0) GOTO 252
- CALL ERROR(408)
- RETURN
- C
- C.... INDEX OK..DO THE REST
- C
- 252 OPNWC=1
- IF(SRCLNE(OP+1).NE."101)GOTO 9000
- IF(SRCLNE(OP+2).LT."60.OR.SRCLNE(OP+2).GT."67) GOTO 9000
- OPNWRD(1)=(SRCLNE(OP+2)-"60)+"60
- C
- C.... CHECK FOR DATA OR ADR REG
- C
- IF(SRCLNE(OP+4).EQ."101.OR.SRCLNE(OP+4).EQ."104) GOTO 255
- GOTO 9000
- 255 IF(SRCLNE(OP+4).EQ."101) OPNWRD(2)=OPNWRD(2)+"100000
- IF(SRCLNE(OP+5).LT."60.OR.SRCLNE(OP+5).GT."67) GOTO 9000
- OPNWRD(2)=OPNWRD(2)+((SRCLNE(OP+5)-"60)*"10000)
- IF(SRCLNE(OP+7).EQ."114) OPNWRD(2)=OPNWRD(2)+"4000
- RETURN
- C
- C.... CHECK FOR END OF OPERAND
- C
- 300 IF(SRCLNE(OP).EQ.0.OR.SRCLNE(OP).EQ."40) GOTO 350
- IF(SRCLNE(OP).NE."54) GOTO 25
- C
- C.... IF BRANCH INSTRUCTION PROC VAL AS PC REL OFFSET
- C
- 350 IF(BRFLG.EQ.1) GOTO 355
- C
- C.... PROCESS VAL AS PC REL UNLESS ITS ABS OR IMMEDIATE
- C
- IF(RFLG.NE.0.OR.IMD.EQ.1) GOTO 400
- C
- C.... IF OPERAND CONTAINED AN EQUATED SYMBOL PROC VAL AS IMMEDIATE
- C
- IF((SYMFLG(STIND).AND."20).EQ."20) GOTO 400
- C
- C.... GENERATE PC RELATIVE OFFSET
- C
- 355 OPNWRD(1)="72
- I=JSUB(SYMVAL,J2,SYMVAL)
- I=JSUB(SYMVAL,PC,OPNWRD(2))
- OPNWC=1
- RETURN
- C
- C.... PROCESS IMMEDIATE DATA
- C
- 400 CALL DBLSGL(SYMVAL,OPNWRD(2),OPNWRD(3))
- IF(IMD.NE.1) GOTO 450
- 405 OPNWC = 1
- IF(IMODE.EQ.3) OPNWC=2
- OPNWRD(1)="74
- RETURN
- C
- 410 OPNWC=2
- OPNWRD(1)="74
- RETURN
- C
- C.... PROCESS ABSOLUTE ADR
- C.... GENERATE LONG ADR FORM IF INSTR MODE LONG
- C
- 450 IF(OPNFLG.EQ.1) GOTO 460
- IF(OPNWRD(3).NE.0) GOTO 460
- IF(OPNWRD(3).LT.0) GOTO 460
- OPNWC=1
- OPNWRD(1)="70
- RETURN
- C
- 460 OPNWC=2
- OPNWRD(1)="71
- RETURN
-
- C
- C.... FATAL ERROR DETECTED
- C
- 9000 OPNWC=7
- C
- C.... MARK POSITION WHERE ERROR OCCURED
- C
- SCANPT = OP
- RETURN
- END
-
- SUBROUTINE DBLSGL(IN,OUT1,OUT2)
- C
- C CONVERT INTEGER*4 TO TWO INTEGER*2 NUMBERS
- C
- IMPLICIT INTEGER (A-Z)
- DIMENSION IN(2)
- OUT1=IN(1)
- OUT2=IN(2)
- RETURN
- END
-
- SUBROUTINE EATYP(TYP,REG)
- C
- C DETERMINE GENERAL TYPE OF OPERAND
- C IN:
- C TYP = POINTER TO START OF OPERAND
- C
- C OUT:
- C TYP 0 = NOT REGISTER OR IMMEDIATE EA
- C 1 = Dn
- C 2 = An
- C 3 = (An)
- C 4 = (An)+
- C 5 =-(An)
- C 6 =#DATA
- C 7 = SR
- C 8 = CCR
- C 9 = USP
- C 10 = ERROR DETECTED
- C
- C REG REG# 0-7
- C
- IMPLICIT INTEGER (A-Z)
- COMMON/PRSE/ OPPTR,MODPTR,OPNPTR,LABEL,CMTPTR
- +,PRFLG,SCANPT,OPCLEN,OPNPT2,IMODE
- COMMON/SRC/ LNELEN,ISERR,NOCARD,SRCLNE
- BYTE SRCLNE(81),LABEL(8)
- OP=TYP
- 100 TYP=0
- IF(SRCLNE(OP).EQ."43)GOTO 700
- IF(SRCLNE(OP).EQ."50)GOTO 500
- IF(SRCLNE(OP).EQ."55.AND.SRCLNE(OP+1).EQ."50)GOTO 400
- IF(SRCLNE(OP).EQ."104.OR.SRCLNE(OP).EQ."101) GOTO 300
- 210 IF(SRCLNE(OP).EQ."123.AND.SRCLNE(OP+1).EQ."122)GOTO 800
- 220 IF(SRCLNE(OP).EQ."103.AND.SRCLNE(OP+1).EQ."103)GOTO 900
- IF(SRCLNE(OP).EQ."125.AND.SRCLNE(OP+1).EQ."123)GOTO 1000
- 240 RETURN
- 300 IF(SRCLNE(OP+1).LT."60.AND.SRCLNE(OP+1).GT."67) RETURN
- IF(SRCLNE(OP).EQ."101)GOTO 310
- TYP=1
- REG=(SRCLNE(OP+1)-"60)
- GOTO 1085
- 310 TYP=2
- REG=(SRCLNE(OP+1)-"60)
- GOTO 1085
- 400 IF(SRCLNE(OP+2).EQ."101.AND.(SRCLNE(OP+3).GE."60.AND.
- +SRCLNE(OP+3).LE."67).AND.SRCLNE(OP+4).EQ."51)GOTO 410
- RETURN
- 410 TYP=5
- REG=(SRCLNE(OP+3)-"60)
- GOTO 1070
- 500 IF(SRCLNE(OP+1).EQ."101.AND.(SRCLNE(OP+2).GE."60.AND.
- +SRCLNE(OP+2).LE."67).AND.SRCLNE(OP+3).EQ."51)GOTO 510
- RETURN
- 510 IF(SRCLNE(OP+4).EQ."53)GOTO 530
- TYP=3
- REG=(SRCLNE(OP+2)-"60)
- GOTO 1075
- 530 TYP=4
- REG=(SRCLNE(OP+2)-"60)
- GOTO 1070
- 700 TYP=6
- RETURN
- 800 TYP=7
- GOTO 1085
- 900 IF(SRCLNE(OP+2).NE."122)GOTO 240
- TYP=8
- GOTO 1080
- 1000 IF(SRCLNE(OP+2).NE."120)GOTO 240
- TYP=9
- GOTO 1080
- 1070 IO=SRCLNE(OP+5)
- GOTO 1090
- 1075 IO=SRCLNE(OP+4)
- GOTO 1090
- 1080 IO=SRCLNE(OP+3)
- GOTO 1090
- 1085 IO=SRCLNE(OP+2)
- 1090 IF(IO.EQ.0.OR.IO.EQ."40.OR.IO.EQ."54) RETURN
- IF(TYP.LE.5.AND.TYP.GE.3) GOTO 1110
- 1100 TYP=0
- RETURN
- 1110 TYP=10
- RETURN
- END
-
- SUBROUTINE DECOPC
- C
- C LOOKUP OPCODE
- C
- C INPUT:OPCODE STARTS AT SRCLNE(OPPTR)
- C
- IMPLICIT INTEGER (A-Z)
- C
- BYTE LABEL(8),SRCLNE(81),PSUOP3(15),PSUOP4(12)
- BYTE PSUOP5(5),OP4BIG(28),OP4PTY(7),OP3BIG(33)
- BYTE OP3PTY(11),OP3NAM(144),OP3TYP(48),OP4NAM(120)
- BYTE OP4TYP(30),OP5NAM(15)
- DIMENSION OP4OPC(14),OP3OPC(22),OP2OPS(3),OP3OPS(48)
- DIMENSION OP4OPS(30),OP5OPS(3)
-
- C
- COMMON/PRSE/ OPPTR,MODPTR,OPNPTR,LABEL,CMTPTR
- +,PRFLG,SCANPT,OPCLEN,OPNPT2,IMODE
- C
- COMMON/SRC/ LNELEN,ISERR,NOCARD,SRCLNE
- C
- COMMON/OPCPTS/ OPTYP,OPSKEL,OPSK2,OPIDX
- C
- DATA PSUOP3/'O','R','G','E','N','D'
- +,'E','Q','U','N','A','M','S','E','T'/
- C
- DATA PSUOP4/'R','O','R','G','P','A','G','E'
- +,'L','I','S','T'/
- C
- DATA PSUOP5/'N','L','I','S','T'/
- C
- DATA OP4BIG/'M','O','V','E','B','C','H','G','B','C','L','R',
- +'B','S','E','T','B','T','S','T','R','O','X','L','R','O','X','R'/
- C
- DATA OP4OPC/0,0,"1100,"4100,"700,"4300,"600,"4200
- +,"400,"4000,"160420,"162700,"160020,"162300/
- C
- DATA OP4PTY/3,10,10,10,10,8,8/
- C
- DATA OP3BIG/'A','D','D','A','S','L','A','S','R','S','U','B'
- +,'A','N','D','C','M','P','E','O','R','L','S','L','L','S','R'
- +,'R','O','L','R','O','R'/
- C
- DATA OP3OPC/"150000,"3000,"160400,"160700
- +,"160000,"160300,"110000,"2000
- +,"140000,"1000,"130000,"6000,"130400,"5000
- +,"160410,"161700,"160010,"161300
- +,"160430,"163700,"160030,"163300/
- C
- DATA OP3PTY/4,8,8,4,6,5,7,8,8,8,8/
- C
- DATA OP2OPS/"100000,"50700,"50300/
- C
- DATA OP3NAM/
- +'B','E','Q', 'B','N','E', 'B','P','L', 'B','M','I', 'B','G','T',
- +'B','L','T', 'B','G','E', 'B','L','E', 'B','H','I', 'B','L','S',
- +'B','C','S', 'B','C','C', 'B','V','S', 'B','V','C', 'B','R','A',
- +'B','S','R', 'C','H','K', 'C','L','R', 'E','X','G', 'E','X','T',
- +'J','M','P', 'J','S','R', 'L','D','M', 'L','E','A', 'N','E','G',
- +'N','O','P', 'N','O','T', 'P','E','A', 'R','T','E', 'R','T','R',
- +'R','T','S', 'S','E','Q', 'S','N','E', 'S','P','L', 'S','M','I',
- +'S','G','T', 'S','L','T', 'S','G','E', 'S','L','E', 'S','H','I',
- +'S','L','S', 'S','C','S', 'S','C','C', 'S','T','M', 'S','V','S',
- +'S','V','C', 'T','A','S', 'T','S','T'/
- C
- DATA OP3OPS/"63400,"63000,"65000,"65400,"67000,"66400,
- +"66000,"67400,"61000,"61400,"62400,"62000,"64400,"64000,
- +"60000,"60400,"40600,"41000,"140000,
- +"44200,"47300,"47200,"46200,"40700,"42000,"47161,"43000,
- +"44100,"47163,"47167,"47165,"53700,"53300,"55300,"55700,
- +"57300,"56700,"56300,"57700,"51300,"51700,"52700,"52300,
- +"44200,"54700,"54300,"45300,"45000/
- C
- DATA OP3TYP/9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,11,12
- +,14,15,12,12,21,16,12,2,12,12,2,2,2,12,12,12,12,12,12
- +,12,12,12,12,12,12,21,12,12,12,12/
- C
- DATA OP4NAM/'A','B','C','D','A','D','D','X','D','B','R','A',
- +'D','B','H','I','D','B','L','S','D','B','C','C','D','B','C','S',
- +'D','B','N','E','D','B','E','Q','D','B','V','C','D','B','V','S',
- +'D','B','P','L','D','B','M','I','D','B','G','E','D','B','L','T',
- +'D','B','G','T','D','B','L','E','D','I','V','S','D','I','V','U',
- +'L','I','N','K','M','U','L','S','M','U','L','U','N','B','C','D',
- +'N','E','G','X','S','B','C','D','S','T','O','P','S','U','B','X',
- +'S','W','A','P','T','R','A','P','U','N','L','K'/
- C
- DATA OP4OPS/"140400,"150400,"50710,"51310,"51710,"52310
- +,"52710,"53310,"53710,"54310,"54710,"55310,"55710,"56310
- +,"56710,"57310,"57710,"100700,"100300,"47120,"140700
- +,"140300,"44000,"40000,"100400,"47162,"110400
- +,"44100,"47100,"47130/
- C
- DATA OP4TYP/19,19,13,13,13,13,13,13,13,13,
- +13,13,13,13,13,13,13,11,11,17,11,11,12,12,19,2,19
- +,15,18,20/
- C
- DATA OP5NAM/'M','O','V','E','M','R','E','S','E','T',
- +'T','R','A','P','V'/
- C
- DATA OP5OPS/"44200,"47160,"47166/
- C
- C START OF OPCODE PROCESSING
- C
- OPTYP=0
- OPSKEL=0
- SCANPT = OPPTR
- IF(OPCLEN.LE.1.OR.OPCLEN.GT.5) RETURN
- C
- C.... PROCESS OPCODE BY SIZE
- C
- GOTO (1000,2000,3000,4000),OPCLEN-1
- C
- C.... TWO CHR OPCODES
- C
- 1000 IF(SRCLNE(OPPTR).EQ."104.OR.SRCLNE(OPPTR).EQ."117)GOTO 1010
- RETURN
- 1010 IF(SRCLNE(OPPTR).EQ."117.AND.SRCLNE(OPPTR+1).EQ."122)GOTO 1020
- IF(SRCLNE(OPPTR+1).EQ."103)GOTO 1030
- IF(SRCLNE(OPPTR+1).EQ."123)GOTO 1040
- RETURN
- 1020 OPTYP=6
- OPIDX=0
- OPSKEL="100000
- OPSK2=0
- RETURN
- 1030 OPTYP=1
- OPIDX=1
- OPSKEL=0
- OPSK2=0
- RETURN
- 1040 OPTYP=1
- OPIDX=2
- OPSKEL=0
- OPSK2=0
- RETURN
- C
- C.... THREE CHR OPCODES
- C
- 2000 CALL OPLOOK(5,3,PSUOP3,OP3TYP,0)
- IF(OPTYP.NE.1) GOTO 2010
- OPIDX=OPIDX+2
- OPSKEL=0
- OPSK2=0
- RETURN
- 2010 CALL OPLOOK(11,3,OP3BIG,OP3PTY,1)
- IF(OPTYP.EQ.0) GOTO 2020
- OPSKEL=OP3OPC((OPIDX*2)-1)
- OPSK2=OP3OPC(OPIDX*2)
- RETURN
- 2020 CALL OPLOOK(48,3,OP3NAM,OP3TYP,1)
- OPSKEL=OP3OPS(OPIDX)
- OPSK2=0
- RETURN
- C
- C.... FOUR CHAR OPCODES
- C
- 3000 CALL OPLOOK(3,4,PSUOP4,OP3NAM,0)
- IF(OPTYP.NE.1) GOTO 3010
- OPIDX=OPIDX+7
- OPSKEL=0
- OPSK2=0
- RETURN
- 3010 CALL OPLOOK(7,4,OP4BIG,OP4PTY,1)
- IF(OPTYP.EQ.O) GOTO 3020
- OPSKEL=OP4OPC((OPIDX*2)-1)
- OPSK2=OP4OPC(OPIDX*2)
- RETURN
- 3020 CALL OPLOOK(30,4,OP4NAM,OP4TYP,1)
- IF(OPTYP.EQ.0) RETURN
- OPSKEL=OP4OPS(OPIDX)
- OPSK2=0
- RETURN
- C
- C.... FIVE CHAR OPCODES
- C
- 4000 CALL OPLOOK(1,5,PSUOP5,OP3TYP,0)
- IF(OPTYP.NE.1) GOTO 4010
- OPIDX=11
- OPSKEL=0
- OPSK2=0
- RETURN
- 4010 CALL OPLOOK(3,5,OP5NAM,OP5OPS,1)
- IF(OPTYP.EQ.0) RETURN
- IF(OPIDX.NE.1) GOTO 4012
- OPTYP=21
- GOTO 4014
- 4012 OPTYP=2
- 4014 OPSKEL=OP5OPS(OPIDX)
- OPSK2=0
- RETURN
- END
-
- SUBROUTINE OPLOOK(ISIZ,ISTEP,ITBL,ITYP,IPSF)
- C
- C.... LOOK UP OPCODE IN TABLES
- C
- IMPLICIT INTEGER (A-Z)
- C
- BYTE LABEL(8)
- C
- COMMON/PRSE/ OPPTR,MODPTR,OPNPTR,LABEL,CMTPTR
- +,PRFLG,SCANPT,OPCLEN,OPNPT2,IMODE
- C
- COMMON /OPCPTS/ OPTYP,OPSKEL,OPSK2,OPIDX
- C
- COMMON /SRC/ LNELEN,ISERR,NOCARD,SRCLNE
- C
- BYTE SRCLNE(81),ITBL(1),ITYP(1)
- C
- IDX=ISIZ * ISTEP
- K=1
- I=1
- 5 DO 20 IS=1,ISTEP
- IF(SRCLNE(OPPTR+(IS-1)).NE.ITBL(I+(IS-1))) GOTO 10
- 20 CONTINUE
- OPIDX=K
- IF(IPSF.EQ.0) GOTO 30
- OPTYP=ITYP(K)
- RETURN
- 10 I=I+ISTEP
- K=K+1
- IF(I.GE.IDX) RETURN
- GOTO 5
- 30 OPTYP=1
- RETURN
- END
-
- SUBROUTINE PARSE
- C
- C PARSE INCOMING SOURCE LINE
- C
- C IN:
- C SRCLNE = LINE TO BE PARSED
- C LNELEN = LENGTH OF SOURCE LINE
- C OUT:
- C LABEL = LABEL FIELD (LABEL(0)=0 IF NO LABEL)
- C OPPTR = POINTER TO OPCODE FIELD
- C OPCLEN = LENGTH OF OPCODE FIELD NOT INCLUDING MODE
- C MODPTR = POINTER TO MODE FIELD
- C IMODE = 0 NO MODE FIELD
- C = 1 .B
- C = 2 .W
- C = 3 .L
- C = 4 .S
- C OPNPTR = POINTER TO FIRST OPERAND
- C OPNPT2 = POINTER TO SECND OPERAND
- C CMTPTR = POINTER TO COMMENT FIELD
- C PRFLG = PARSE FLAG - ZERO IF ERROR DETECTED
- C
- IMPLICIT INTEGER (A-Z)
- COMMON /SRC/ LNELEN,ISERR,NOCARD,SRCLNE
- COMMON/PRSE/ OPPTR,MODPTR,OPNPTR,LABEL,CMTPTR
- +,PRFLG,SCANPT,OPCLEN,OPNPT2,IMODE
- BYTE SRCLNE(81),IC,LABEL(8),MODTBL(4)
- DATA MODTBL/"102,"127,"114,"123/
- IPF = 0
- IMODE = 0
- PRFLG = 1
- LABEL(1)=0
- C
- C INITALIZE LABEL ARRAY TO ALL SPACES
- C
- DO 10 I=2,8
- LABEL(I)=32
- 10 CONTINUE
-
- SCANPT = 1
- OPCLEN = 0
- OPPTR = 0
- OPNPTR = 0
- OPNPT2 = 0
- MODPTR = 0
- CMTPTR = 0
- C
- C IF NULL LINE IGNORE IT
- C
- IF(LNELEN.NE.1) GOTO 15
- 12 PRFLG=0
- RETURN
- C
- C CHECK FOR A LINE OF COMMENTS
- C
- 15 IF(SRCLNE(1).NE."52) GOTO 16
- CMTPTR=1
- RETURN
- C
- C SEE IF LABEL PRESENT
- C
- 16 IF(SRCLNE(SCANPT).EQ."40) GOTO 60
- C
- C LABELS HAVE TO START WITH A-Z
- C
- IF(SRCLNE(1).GE."101.AND.SRCLNE(1).LE.90) GOTO 30
- 20 CALL ERROR(202)
- RETURN
- C
- 30 DO 40 SCANPT=1,8
- IF (SRCLNE(SCANPT).GE.48.AND.SRCLNE(SCANPT).LE.57) GOTO 35
- IF(SRCLNE(SCANPT).LT.65.OR.SRCLNE(SCANPT).GT.90) GOTO 45
- 35 LABEL(SCANPT)=SRCLNE(SCANPT)
- 40 CONTINUE
- 45 IF(SCANPT.GE.4) GOTO 50
- IF(LABEL(1).EQ."101.OR.LABEL(1).EQ."104) GOTO 46
- IF(LABEL(1).EQ."123) GOTO 47
- IF(LABEL(1).EQ."103) GOTO 48
- IF(LABEL(1).NE."125) GOTO 50
- IF(LABEL(2).EQ."123.AND.LABEL(3).EQ."120) GOTO 49
- GOTO 50
- C
- 46 IF(SCANPT.GT.3) GOTO 50
- IF(LABEL(2).GE."60.AND.LABEL(2).LE."67) GOTO 49
- GOTO 50
- C
- 47 IF(LABEL(2).EQ."120.OR.LABEL(2).EQ."122) GOTO 49
- GOTO 50
- C
- 48 IF(LABEL(2).EQ."103.AND.LABEL(3).EQ."122) GOTO 49
- GOTO 50
- C
- 49 PRFLG=0
- CALL ERROR(204)
- RETURN
- C
- 50 IF(SRCLNE(SCANPT).EQ."40.OR.SRCLNE(SCANPT).EQ."72) GOTO 60
- PRFLG=0
- CALL ERROR(205)
- RETURN
- C
- 60 SCANPT=SCANPT+1
- PRFLG=1
- 62 IF(SRCLNE(SCANPT).NE."40) GOTO 70
- SCANPT=SCANPT+1
- GOTO 62
- C
- 70 IF(SRCLNE(SCANPT).EQ.0) GOTO 12
- OPPTR=SCANPT
- DO 80 I=1,5
- IF(SRCLNE(SCANPT).LT.65.OR.SRCLNE(SCANPT).GT.90) GOTO 90
- SCANPT=SCANPT+1
- 80 CONTINUE
- C
- C.... LENGTH OF OPCODE IS ONE LESS THAN # SCANNED
- 90 OPCLEN=I-1
- C
- C.... CHECK FOR END OF LINE
- IF(SRCLNE(SCANPT).EQ.0) RETURN
- C
- C.... CHECK FOR SPACE
- IF(SRCLNE(SCANPT).EQ."40) GOTO 112
- C
- C.... CHECK FOR xxx.x
- IF(SRCLNE(SCANPT).EQ."56) GOTO 100
- C
- C.... IF NOT EOL,SPC,OR PERIOD GEN ERROR
- 95 OPPTR=0
- PRFLG=0
- CALL ERROR(207)
- RETURN
- C
- C.... CHECK FOR .B .W .L .S
- C.... POINT TO SIZE SUBFIELD
- 100 SCANPT=SCANPT+1
- C
- C.... SCAN FOR VALID SIZE
- DO 102,IMODE = 1,4
- 102 IF(MODTBL(IMODE).EQ.SRCLNE(SCANPT))GOTO 105
- C
- C.... IF NOT IN TABLE IT'S INVALID
- IMODE = 0
- GOTO 95
- C
- C.... SAVE POSITION OF MODE FIELD
- 105 MODPTR=SCANPT
- C
- C.... CHECK FOR SPACE AFTER OPCODE
- 110 SCANPT=SCANPT+1
- IF(SRCLNE(SCANPT).NE."40) GOTO 95
- C
- C.... PARSE FIRST OPERAND IF THERE
- 112 SCANPT=SCANPT+1
- IC=SRCLNE(SCANPT)
- IF(IC.EQ. 0 ) RETURN
- IF(IC.EQ."40) GOTO 112
- IF(IC.EQ."44.OR.IC.EQ."52) GOTO 114
- IF ((IC.EQ."50).OR.(IC.EQ."47)) GOTO 114
- IF(IC.EQ."55.OR.IC.EQ."43) GOTO 114
- IF(IC.GE."60.AND.IC.LE."71) GOTO 114
- IF(IC.LT."101.OR.IC.GT."132) GOTO 95
- C
- C.... SAVE START OF FIRST OPERAND
- C
- 114 OPNPTR=SCANPT
- IF ((SRCLNE(SCANPT).NE."47).AND.(SRCLNE(SCANPT+1).NE."47))
- + GOTO 116
- IF (SRCLNE(SCANPT+1).EQ."47) SCANPT = SCANPT + 1
- 115 SCANPT = SCANPT+1
- IF(SRCLNE(SCANPT).EQ.0) GOTO 118
- IF(SRCLNE(SCANPT).NE."47) GOTO 115
- 116 SCANPT=SCANPT+1
- IC=SRCLNE(SCANPT)
- IF((IC.EQ.0).OR.(IC.EQ."40)) GOTO 118
- IF(IC.EQ."50) IPF=1
- IF(IC.EQ."51) IPF=0
- IF(IC.EQ."54.AND.IPF.EQ.0) GOTO 120
- GOTO 116
- 118 OPNPT2=0
- IF (IC.NE."40) RETURN
- 119 SCANPT = SCANPT+1
- IF (SRCLNE(SCANPT).EQ."40) GOTO 119
- CMTPTR = SCANPT
- RETURN
- C
- C.... SAVE START OF SECOND OPERAND
- C
- 120 OPNPT2=SCANPT+1
- 125 SCANPT = SCANPT + 1
- IF (SRCLNE(SCANPT).EQ."40) GOTO 130
- IF (SRCLNE(SCANPT).EQ.0 ) RETURN
- IF (SRCLNE(SCANPT).NE."47) GOTO 125
- 127 SCANPT = SCANPT + 1
- IF (SRCLNE(SCANPT).EQ.0 ) RETURN
- IF (SRCLNE(SCANPT).NE."47) GOTO 127
- GOTO 125
- 130 SCANPT = SCANPT + 1
- IF (SRCLNE(SCANPT).EQ."40) GOTO 130
- CMTPTR = SCANPT
- RETURN
- END